Используя git, как я могу искать строку во всех ветвях?

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

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

Ответ 1

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

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

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

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

  • язык: language:
  • имя репозитория (включая имя пользователя): repo:
  • путь к файлу: path:

Ответ 2

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

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

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

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

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

Ответ 3

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

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

или

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

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

nano ~/history.txt
git show-ref --heads | xargs git grep "search string here" >> ~/history.txt

Ответ 4

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

  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"

Ответ 5

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

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

Ответ 6

Я использую следующую команду, чтобы получить ветку по ее строке

git branch -a | grep "your string"