Можно ли запустить 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)
Текущая структура:
: - Разделитель
dev53modules/factory/getters.phpfunction 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