Можно ли запустить git grep
все ветки проекта Git? Или есть другая команда для запуска?
Можно ли запустить git grep
все ветки проекта Git? Или есть другая команда для запуска?
Ответы:
На вопрос « Как выполнить поиск (поиск) зафиксированного кода в истории 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>
git branch
в tr или sed; git branch
это фарфоровая команда, предназначенная для потребления человеком. См. Stackoverflow.com/a/3847586/2562319 для предпочтительных альтернатив.
git log
может быть более эффективным способом поиска текста во всех ветвях, особенно если имеется много совпадений, и вы хотите сначала увидеть более свежие (релевантные) изменения.
git log -p --all -S 'search string'
git log -p --all -G 'match regular expression'
Эти комманды журнала регистрируют коммиты, которые добавляют или удаляют заданную строку поиска / регулярное выражение, (как правило) более новые в первую очередь. -p
Опция вызывает соответствующий дифференциал будет показан , где была добавлена или удалена картина, так что вы можете увидеть его в контексте.
Найдя соответствующий коммит, который добавляет текст, который вы искали (например, 8beeff00d), найдите ветки, которые содержат коммит:
git branch -a --contains 8beeff00d
Я нашел это наиболее полезным:
git grep -i foo `git for-each-ref --format='%(refname)' refs/`
Вам нужно будет настроить последние аргументы в зависимости от того, хотите ли вы смотреть только на удаленные или локальные ветви, то есть:
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" "$@" "$(git for-each-ref --format=\"%(refname)\"" refs/)'
git for-each-ref
с --sort=-committerdate --count=100
! Спасибо за оригинальную идею!
Это можно сделать двумя способами: псевдонимы 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"
Команды должны быть добавлены в ~/.gitconfig
файл вручную , потому что вы git config --global alias
оцениваете сложный код и вносите в него ошибки
[alias]
grep-branch = "!f(){ git branch -a | sed -e 's/[ \\*]*//' | grep -v -e '\\->' | xargs git grep $@; };f "
grep-branch-remote = "!f(){ git branch -a | sed -e 's/[ \\*]*//' | grep -v -e '\\->' | grep '^remotes' | xargs git grep $@; };f"
grep-branch-local = "!f(){ git branch -a | sed -e 's/[ \\*]*//' | grep -v -e '\\->' -e '^remotes' | xargs git grep $@; };f "
Примечание. Когда вы добавляете псевдонимы, но они не запускаются - проверьте обратную косую черту, для \
них может потребоваться дополнительный экранирование \\
по сравнению с командами 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
Префикс номера строки соответствует строке.
[user@pc 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)
Как вы должны знать: команды 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"
git grep-branch "find my text"
:fatal: ambiguous argument 'client': both revision and filename
-a
, который показывает все ветви? Я бы предложил использовать опции git branch
команды для разделения веток. При взгляде на местные филиалы, есть только один *
, так что нет необходимости избегать его для sed. Итак: только git branch | sed -e 's/*/ /' | xargs git grep "TEXT"
для локальных филиалов, только git branch -r | grep -v -- "->" | xargs git grep "TEXT"
для удаленных филиалов и git branch -a | grep -v -- "->" | xargs git grep "TEXT"
для всех филиалов
Вот как я это делаю:
git for-each-ref --format='%(*refname)' | xargs git grep SEARCHTERM