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

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

Ответ 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)

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