Он просматривает все коммиты, которые должны включать все ветви.
Другая форма будет:
git rev-list --all | (
while read revision; do
git grep -F 'yourWord' $revision
done
)
Вы можете найти еще больше примеров в этой статье :
Я попробовал описанное выше на одном достаточно большом проекте, чтобы git пожаловался на размер аргумента, поэтому, если вы столкнетесь с этой проблемой, сделайте что-то вроде:
Не очень хорошая идея передавать результаты git branchв tr или sed; git branchэто фарфоровая команда, предназначенная для потребления человеком. См. Stackoverflow.com/a/3847586/2562319 для предпочтительных альтернатив.
Да, хорошо. Просматривая другие ответы, я думаю, что ответ @errordeveloper - самый чистый: stackoverflow.com/a/21284342/2562319 : "git grep <regexp> $ (git for-each-ref --format = '% (refname) 'refs /) "
jbyler
1
Есть ли способ показать название ветки, которая соответствовала поиску?
Франкс
63
git log может быть более эффективным способом поиска текста во всех ветвях, особенно если имеется много совпадений, и вы хотите сначала увидеть более свежие (релевантные) изменения.
Эти комманды журнала регистрируют коммиты, которые добавляют или удаляют заданную строку поиска / регулярное выражение, (как правило) более новые в первую очередь. -pОпция вызывает соответствующий дифференциал будет показан , где была добавлена или удалена картина, так что вы можете увидеть его в контексте.
Найдя соответствующий коммит, который добавляет текст, который вы искали (например, 8beeff00d), найдите ветки, которые содержат коммит:
Интересный псевдоним. +1. Точнее, чем в моем ответе.
VonC
Как заставить ваш псевдоним работать для поиска по фразе? Когда я передаю «foo bar» в качестве параметра, я получаю: fatal: неоднозначный аргумент «bar»: неизвестная ревизия или путь вне рабочего дерева. Используйте '-', чтобы отделить пути от ревизий
jutky
Попробуйте убежать от места: "foo \ bar"
Гарри Гомес
Ясно, что это будет принятый ответ;) Я расширил его для поиска только по последним ветвям моего проекта (получил более 500, не спрашивайте, и каждый grep занимает около 4 секунд, поэтому я не хочу и не нужен искать более чем, скажем, 100 последних из них). Для этого я обновил git for-each-refс --sort=-committerdate --count=100! Спасибо за оригинальную идею!
Вс
6
Это можно сделать двумя способами: псевдонимы Bash или Git.
Вот три команды:
git grep-branch - Поиск во всех филиалах локальных и удаленных
git grep-branch-local - Искать только в местных филиалах
Примечание. Когда вы добавляете псевдонимы, но они не запускаются - проверьте обратную косую черту, для \них может потребоваться дополнительный экранирование \\по сравнению с командами bash .
git branch -a - отображать все ветки;
sed -e 's/[ \\*]*//'- пробелы (от branch -a) и * (у активного имени ветви есть);
Звучит хорошо, но я получил эту ошибку от git grep-branch "find my text":fatal: ambiguous argument 'client': both revision and filename
nealmcb
Почему всегда использовать -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? » Рекомендуется:
Он просматривает все коммиты, которые должны включать все ветви.
Другая форма будет:
Вы можете найти еще больше примеров в этой статье :
(см. альтернативу в последнем разделе этого ответа ниже)
Не забудьте эти настройки, если вы хотите их:
Этот псевдоним тоже может помочь:
Примечание: Черни предположил, что
git rev-list --all
это излишество.Обновление август 2016: RM рекомендует в комментариях
То есть:
источник
git branch
в tr или sed;git branch
это фарфоровая команда, предназначенная для потребления человеком. См. Stackoverflow.com/a/3847586/2562319 для предпочтительных альтернатив.git log
может быть более эффективным способом поиска текста во всех ветвях, особенно если имеется много совпадений, и вы хотите сначала увидеть более свежие (релевантные) изменения.Эти комманды журнала регистрируют коммиты, которые добавляют или удаляют заданную строку поиска / регулярное выражение, (как правило) более новые в первую очередь.
-p
Опция вызывает соответствующий дифференциал будет показан , где была добавлена или удалена картина, так что вы можете увидеть его в контексте.Найдя соответствующий коммит, который добавляет текст, который вы искали (например, 8beeff00d), найдите ветки, которые содержат коммит:
источник
Я нашел это наиболее полезным:
Вам нужно будет настроить последние аргументы в зависимости от того, хотите ли вы смотреть только на удаленные или локальные ветви, то есть:
git grep -i foo $(git for-each-ref --format='%(refname)' refs/remotes)
git grep -i foo $(git for-each-ref --format='%(refname)' refs/heads)
Псевдоним, который я создал, выглядит следующим образом:
источник
git for-each-ref
с--sort=-committerdate --count=100
! Спасибо за оригинальную идею!Это можно сделать двумя способами: псевдонимы Bash или Git.
Вот три команды:
git grep-branch
- Поиск во всех филиалах локальных и удаленныхgit grep-branch-local
- Искать только в местных филиалахgit grep-branch-remote
- только удаленные филиалыИспользование такое же, как
git grep
Использование GREP: Git aliases
Файл ~ / .gitconfig
Команды должны быть добавлены в
~/.gitconfig
файл вручную , потому что выgit config --global alias
оцениваете сложный код и вносите в него ошибкиПримечание. Когда вы добавляете псевдонимы, но они не запускаются - проверьте обратную косую черту, для
\
них может потребоваться дополнительный экранирование\\
по сравнению с командами 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
Префикс номера строки соответствует строке.Текущая структура:
:
- Разделительdev
53
modules/factory/getters.php
function getTastyCookies($user)
Использование GREP: BASH
Как вы должны знать: команды Bash должны храниться в
.sh
скриптах или запускаться в оболочке.Только местные филиалы
Только удаленные филиалы
Локальные и удаленные филиалы
источник
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"
для всех филиаловВот как я это делаю:
источник
Если вы дадите коммиту значение хеш-функции SHA-1, он будет выполнять
git grep
поиск по ним, а не по рабочей копии.Чтобы найти все ветви, вы можете получить все деревья с
git rev-list --all
. Поместите все это с... и иметь терпение
источник