Используя git, как я могу найти строку во всех ветвях? - PullRequest
131 голосов
/ 22 августа 2011

Используя git, как я могу найти данную строку во всех файлах во всех локальных ветвях?

Специфично для Github: возможно ли выполнить вышеуказанный поиск по всем веткам github? (В моем удаленном репозитории github есть несколько удаленных веток, которые в идеале не нужно было бы сбрасывать для этого поиска ..)

Ответы [ 5 ]

135 голосов
/ 22 августа 2011

Вы можете сделать это в репозитории Git:

git grep "string/regexp" $(git rev-list --all)

Расширенный поиск Github имеет возможность поиска кода:

Поиск по коду просматривает весь код, публично размещенный на GitHub.Вы также можете отфильтровать по:

  • по языку: language:
  • по имени хранилища (включая имя пользователя): repo:
  • путь к файлу: path:
99 голосов
/ 17 мая 2013

Если вы используете команду @manojlds git grep и получаете сообщение об ошибке:

-bash: /usr/bin/git: Argument list too long" 

тогда вы должны использовать xargs:

git rev-list --all | xargs git grep "string/regexp"

Также см. Как выполнить поиск (поиск) подтвержденного кода в истории git?

40 голосов
/ 22 июня 2016

Во многих случаях git rev-list --all может возвращать огромное количество коммитов, которые нужно сканировать вечно.Если вы вместо поиска по каждой фиксации в каждой ветке в своей истории хранилища просто хотите найти все подсказки по веткам, вы можете заменить ее на git show-ref --heads.Всего:

git grep "string" `git show-ref --heads`

или:

git show-ref --heads | xargs git grep "string"

Совет: Вы можете записать вывод в файл для просмотра в редакторе.

11 голосов
/ 24 марта 2017

Есть несколько проблем с решениями, перечисленными здесь (даже приняты).

  1. Вам не нужно перечислять все хэши, так как вы получите дубликаты, также это займет больше времени.

Он основан на этом, где вы можете искать строку "test -f /" по нескольким ветвям master и dev как

git grep "test -f /" master dev

, что совпадает с

printf "master\ndev" | xargs git grep "test -f /"

Так что вот так.

Находит хэши для кончика всех локальных ветвей и ищет только в этих коммитах.

git branch -v --no-abbrev | awk -F' *' '{print $3}' | xargs git grep "string/regexp"

Если вам также нужен поиск в удаленных ветвях, добавьте -a:

git branch -a -v --no-abbrev | awk -F' *' '{print $3}' | xargs git grep "string/regexp"

Обновление:

# search in local branches
git branch | cut -c3- | xargs git grep "string"
# search in remote branches
git branch -r | cut -c3- | xargs git grep "string"
# search in all (local and remote) branches
git branch -a | cut -c3- | cut -d' ' -f 1 | xargs git grep "string"

# search in branches, and tags
git show-ref | grep -v "refs/stash" | cut -d' ' -f2 | xargs git grep "string"
2 голосов
/ 12 февраля 2018

Вы можете попробовать это

git log -Sxxxx  #search all commits
git log -Sxxxx  --branches[=<pattern>]   #search branches
...