Можно ли выполнить "поиск по 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.
Вот три команды:
-
git grep-branch
- Поиск во всех ветких локальных и удаленных -
git grep-branch-local
- Искать только в локальных ветких -
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)
Текущая структура:
:
- Разделитель
- Ветвь:
dev
- Номер строки:
53
- Путь к файлу:
modules/factory/getters.php
- Соответствующая строка:
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)
... и терпение