Подтвердить что ты не робот

Можно ли выполнить "поиск по grep" во всех ветвях проекта Git?

Можно ли запустить git grep всех ветвях проекта управления Git? Или есть другая команда для запуска?

4b9b3361

Ответ 1

Вопрос " Как выполнить поиск (поиск) зафиксированного кода в истории git? " Рекомендует:

 git grep <regexp> $(git rev-list --all)

Он просматривает все коммиты, которые должны включать все ветки.

Другая форма будет:

git rev-list --all | (
    while read revision; do
        git grep -F 'yourWord' $revision
    done
)

Вы можете найти еще больше примеров в этой статье:

Я попробовал описанное выше на одном достаточно большом проекте, чтобы git пожаловался на размер аргумента, поэтому, если вы столкнетесь с этой проблемой, сделайте что-то вроде:

git rev-list --all | (while read rev; do git grep -e <regexp> $rev; done)

(см. альтернативу в последнем разделе этого ответа ниже)

Не забудьте эти настройки, если вы хотите их:

# Allow Extended Regular Expressions
git config --global grep.extendRegexp true
# Always Include Line Numbers
git config --global grep.lineNumber true

Этот псевдоним тоже может помочь:

git config --global alias.g "grep --break --heading --line-number"

Примечание: Черни предположил, что git rev-list --all - это перебор.

Более точная команда может быть:

git branch -a | tr -d \* | xargs git grep <regexp>

Который позволит вам искать только ветки (включая удаленные ветки)

Вы можете даже создать псевдоним bash/zsh для него:

alias grep_all="git branch -a | tr -d \* | xargs git grep"
grep_all <regexp>

Обновление август 2016: RM рекомендует в комментариях

Я получил " fatal: bad flag '->' used after filename " при попытке использовать версию git branch. Ошибка была связана с обозначением псевдонима HEAD.

Я решил это, добавив sed ' / ->/d' в канал между командами tr и xargs.

 git branch -a | tr -d \* | sed '/->/d' | xargs git grep <regexp>

То есть:

alias grep_all="git branch -a | tr -d \* | sed '/->/d' | xargs git grep"
grep_all <regexp>

Ответ 2

git log может быть более эффективным способом поиска текста по всем ветвям, особенно если есть много совпадений, и вы хотите сначала увидеть более свежие (соответствующие) изменения.

git log -p --all -S 'search string'
git log -p --all -G 'match regular expression'

Этот список команд журнала фиксирует то, что добавляет или удаляет заданную строку поиска/регулярное выражение (обычно) более поздним первым. Опция -p вызывает отображение соответствующего diff, где шаблон был добавлен или удален, поэтому вы можете увидеть его в контексте.

Найдя соответствующий коммит, который добавляет текст, который вы искали (например, 8beeff00d), найдите ветки, которые содержат commit:

git branch -a --contains 8beeff00d

Ответ 3

Я нашел это наиболее полезным:

git grep -i foo `git for-each-ref --format='%(refname)' refs/`

Вам нужно будет отрегулировать последние аргументы в зависимости от того, хотите ли вы смотреть только на удаленные vs локальные ветки, то есть:

  • git grep -i foo $(git for-each-ref --format='%(refname)' refs/remotes)
  • git grep -i foo $(git for-each-ref --format='%(refname)' refs/heads)

Созданный псевдоним выглядит следующим образом:

grep-refs = !sh -c 'git grep "$0" "[email protected]" "$(git for-each-ref --format=\"%(refname)\"" refs/)'

Ответ 4

Вот как я это делаю:

git for-each-ref --format='%(*refname)' | xargs git grep SEARCHTERM

Ответ 5

Это можно сделать двумя способами: псевдонимы Bash или Git.

Вот три команды:

  1. git grep-branch - Поиск во всех ветких локальных и удаленных
  2. git grep-branch-local - Искать только в локальных ветких
  3. git grep-branch-remote - только удаленные ветки

Использование такое же, как git grep

git grep-branch "find my text"
git grep-branch --some-grep-options "find my text"

Использование GREP: Git aliases

Файл ~/.gitconfig

Команды должны быть добавлены вручную в файл ~/.gitconfig, потому что git config --global alias оценивает сложный код, который вы добавляете, и портит его.


[alias]
    grep-branch        = "!f(){ git branch -a | sed -e 's/[ \\*]*//' | grep -v -e '\\->' | xargs git grep [email protected]; };f "
    grep-branch-remote = "!f(){ git branch -a | sed -e 's/[ \\*]*//' | grep -v -e '\\->' | grep '^remotes' | xargs git grep [email protected]; };f"
    grep-branch-local  = "!f(){ git branch -a | sed -e 's/[ \\*]*//' | grep -v -e '\\->' -e '^remotes' | xargs git grep [email protected];  };f "

Примечание. Когда вы добавляете псевдонимы, но они не запускаются - проверьте обратную косую черту \ них может потребоваться дополнительный escape \\ по сравнению с командами bash.

  • git branch -a - Показать все ветки;
  • sed -e 's/[ \\*]*//' - Обрезать пробелы (из branch -a) и * (у имени активной ветки есть);
  • grep -v -e '\\->' - игнорировать сложные имена, такие как remotes/origin/HEAD → origin/master;
  • grep '^remotes' - получить все удаленные ветки;
  • grep -v -e '^remotes' - Получить ветки, кроме удаленных веток;

Пример git grep-branch-local -n getTastyCookies

-n Префикс номера строки к совпадающим линиям.

[[email protected] project]$ git grep-branch-local -n getTastyCookies

dev:53:modules/factory/getters.php:function getTastyCookies($user);
master:50:modules/factory/getters.php:function getTastyCookies($user)

Текущая структура:

: - Разделитель

  1. Ветвь: dev
  2. Номер строки: 53
  3. Путь к файлу: modules/factory/getters.php
  4. Соответствующая строка: function getTastyCookies($user)

GREP использует: BASH

Как вы должны знать: команды Bash должны храниться в сценариях .sh или запускаться в оболочке.

Только локальные ветки

git branch -a | sed -e 's/[ \*]*//' | grep -v -e '\->' -e '^remotes' | xargs git grep "TEXT"

Только удаленные ветки

git branch -a | sed -e 's/[ \*]*//' | grep -v -e '\->' | grep '^remotes' | xargs git grep "TEXT"

Локальные и удаленные ветки

git branch -a | sed -e 's/[ \*]*//' | grep -v -e '\->' | xargs git grep "TEXT"

Ответ 6

Если вы даете какой-либо фиксации SHA1 на git grep, у вас есть поиск в них вместо рабочей копии.

Для поиска всех ветвей вы можете получить все деревья с помощью git rev-list --all. Поместите все это с помощью

git grep "regexp" $(git rev-list --all)

... и терпение