Як користуватися Git, як я можу шукати рядок у всіх гілках?


170

Використовуючи Git, як я міг шукати по всіх файлах у всіх локальних гілках заданий рядок?

Конкретний GitHub: чи можна здійснювати вищезазначений пошук у всіх відділеннях GitHub? (У моєму віддаленому сховищі GitHub є декілька віддалених гілок, які в ідеалі я б не зводив для цього пошуку ...)


1
git-grep може бути те, що ви шукаєте, але я ще не впевнений, які варіанти вам знадобляться ...
johnny

Відповіді:


170

Це можна зробити у сховищі Git:

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

Розширений пошук GitHub має можливість пошуку коду:

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

  • мова: language:
  • назва сховища (включаючи ім’я користувача): repo:
  • шлях до файлу: path:

Це спричиняє мені помилку сегментації. Хоча це може бути черепаховий трюм (Windows).
bean5

6
Це дійсно не найкращий спосіб зробити це. Він не контролює кількість git refs, які передаються git grep .... Подивіться на інші відповіді, вони набагато кращі за цю, навіть якщо вона позначена як прийнята відповідь!
slm

1
Було б чудово, якщо ви можете додати приклад для своїх фільтрів, наприклад path:, тому що документація з першого погляду не зрозуміла, де застосувати цей фільтр, припускаючи його перед цитатами у вашому прикладі запиту?
блам

3
як я можу вказати лише ім'я філії Наразі в ньому перелік усіх хешів містить рядок.
harryfeng

4
Пошук Github знаходиться на головній гілці тільки . From help.github.com/articles/searching-code : "Для пошуку коду індексується лише гілка за замовчуванням. У більшості випадків це буде головна гілка."
RedPanda

124

Якщо ви використовуєте команду @manojlds Git grep та отримуєте помилку:

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

тоді слід використовувати xargs :

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

Також дивіться Як зібрати (шукати) вчинений код в історії Git


Крім того, це, здається, більше сумісне з іншими видами консолей, як fishshell
Daniel

1
Дякую!!! використовуючи ZSH, і це спрацьовувало, коли команда @manojlds дала помилку, яку ви згадали! Але попередження, це може зайняти ДУЖЕ багато часу для великого репо з довгою історією.
лакостенікодер

54

У багатьох випадках 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

6
git show-ref --headsперелічує хеш та назву ref, щоб він (2-й рядок) шукав двічі. так що git show-ref --heads | cut -d' ' -f2краще, оскільки він буде лише перелічити імена ref.
hIpPy

4
Я не можу повірити, скільки разів на це запитання і відповідь, але ти єдиний із правильною відповіддю.
Саммітч

1
git show-ref --heads -sвиводить тільки хеш SHA1. Крім того, якщо є декілька гілок, які вказують на одне і те ж фіксацію, у вас будуть дублікати. Ви можете видалити їх sort -u, як-от такgit show-ref --heads -s | sort -u | xargs git grep ...
Стів

Ось функція, яку я додав до свого bashrc. Сподіваюся, що це комусь допоможе:function gsearch { git grep $1 $(git show-ref --heads) | grep "refs/heads" | grep $1 } # last grep to keep grep color highlight
AFP_555

Це має бути прийнятою відповіддю. Обрізка рядка в усіх гілках, але лише для останнього вмісту - це дуже поширений випадок використання.
dr_

21

Є декілька проблем із переліченими тут рішеннями (навіть прийнятими).

Не потрібно перераховувати всі хеші, оскільки ви отримаєте дублікати. Також потрібно більше часу.

Це спирається на це, де ви можете шукати рядок "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 branch -a | cut -c3- | cut -d' ' -f 1 | xargs git grep "string" або це не вдасться зі ->символом у списку файлів, який позначає відношення локальних до віддалених гілок
Ілля Шершофф

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.