Git'i kullanarak tüm şubelerde nasıl bir dize arayabilirim?


170

Git'i kullanarak, belirli bir dize için tüm yerel şubelerdeki tüm dosyalarda nasıl arama yapabilirim?

GitHub'a özgü: yukarıdaki aramayı tüm GitHub kollarında gerçekleştirmek mümkün müdür? (Uzak GitHub veri havuzumda ideal olarak bu arama için indirmem gerekmeyecek birkaç uzak şube var ...)


1
git-grep aradığınız şey olabilir, ancak hangi seçeneklere ihtiyacınız olacağından henüz emin değilim ...
johnny

Yanıtlar:


170

Bunu bir Git deposunda yapabilirsiniz:

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

GitHub gelişmiş aramada kod arama özelliği vardır:

Kod arama, GitHub'da herkese açık olarak barındırılan tüm kodları arayacaktır. Ayrıca şunlara göre filtreleyebilirsiniz:

  • dil: language:
  • havuz adı (kullanıcı adı dahil): repo:
  • dosya yolu: path:

Bu bana bir segmentasyon hatasına neden oluyor. Gerçi tortoisegitmerge (Windows) olabilir.
bean5

6
Bunu yapmanın en iyi yolu bu değil. Geçilen git ref'lerinin miktarını kontrol etmez git grep .... Diğer cevaplara bakın, kabul edilen cevap olarak işaretlenmiş olmasına rağmen bundan daha iyi!
slm

1
Eğer örneğin Filtrelerinizden, örnek ekleyebilirsiniz eğer iyi olurdu path:bir bakışta doesnt bakışta belgeleri temizlemek için bu filtreyi, im varsayarak uygulanacağı yeri, onun sorgu örneğinde tırnak önce?
1717

3
yalnızca şube adını nasıl listeleyebilirim? Şu anda, tüm karma dizeyi içeren listeler.
harryfeng

4
Github araması yalnızca ana dalda yapılır . Gönderen help.github.com/articles/searching-code : "Yalnızca varsayılan şube kodu arama için dizine Çoğu durumda, bu ana dal olacaktır.".
RedPanda

124

@Manojlds Git grep komutunu kullanır ve bir hata alırsanız:

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

o zaman xargs kullanmalısınız :

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

Ayrıca Git geçmişinde işlenen kodu nasıl grep (arama) yapabilirim


Ayrıca, bu balık kabuğu gibi diğer konsollarla daha uyumlu görünüyor
Daniel

1
Teşekkürler!!! @manojlds komutu bahsettiğiniz hatayı verirken ZSH kullanarak bu çalıştı! Ancak uyarı, bu uzun bir geçmişi olan büyük bir repo için çok uzun zaman alabilir.
lacostenycoder

54

Birçok durumda git rev-list --all, taramak sonsuza dek süren çok sayıda taahhüt döndürebilir. Havuz geçmişinizdeki her dalda yapılan her bir taahhüdü aramak yerine, yalnızca tüm şube ipuçlarını aramak istiyorsanız, bunun yerine değiştirebilirsiniz git show-ref --heads. Yani toplamda:

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

veya:

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

İpucu: Çıktıyı bir düzenleyicide görüntülemek için dosyaya yazabilirsiniz:

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

6
git show-ref --headskarma ve ref adını listeler, böylece (2. satır) iki kez arama yapar. böylece git show-ref --heads | cut -d' ' -f2daha iyi sadece ref isimlerini listeler gibidir.
17'de

4
Bu sorunun kaç kez sorulduğuna ve cevaplandığına inanamıyorum, ancak doğru cevabı veren tek kişi sensin .
Sammitch

1
git show-ref --heads -syalnızca SHA1 karmasını verir. Ayrıca, aynı taahhüdü işaret eden birden fazla şube varsa, kopyalarınız olacaktır. Sen ile kaldırabilirsiniz sort -uşöyle,git show-ref --heads -s | sort -u | xargs git grep ...
Steve

İşte benim bashrc'e eklediğim işlev. Umarım birine yardımcı olur:function gsearch { git grep $1 $(git show-ref --heads) | grep "refs/heads" | grep $1 } # last grep to keep grep color highlight
AFP_555

Bu kabul edilen cevap olmalı. Bir dizeyi tüm dallarda selamlamak ancak yalnızca en son içerik için çok yaygın bir kullanım durumudur.
dr_

21

Burada listelenen çözümlerle ilgili birkaç sorun vardır (hatta kabul edilir).

Kopyaları alacağınız için tüm karmaları listelemenize gerek yoktur. Ayrıca, daha fazla zaman alır.

Eğer bir dize arayabileceğiniz bu üzerine inşa "test -f /"birden dalları üzerinde masterve devolarak

git grep "test -f /" master dev

ki aynı

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

İşte gidiyor.

Bu, tüm yerel şubelerin ipucu karmasını bulur ve yalnızca bu taahhütlerde arama yapar:

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

Uzak dallarda da arama yapmanız gerekiyorsa ekleyin -a:

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

Daha ileri:

# 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
en azından tüm şubelerde arama için: git branch -a | cut -c3- | cut -d' ' -f 1 | xargs git grep "string" ya da ->yerel - uzak şubeler arasındaki ilişkiyi gösteren dosya listesindeki sembolle başarısız olacaktır
Ilya Sheershoff

8

Bunu deneyebilirsiniz:

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

2
Tüm şubelerde:git log --all -s"search_string"
Tim Kuipers
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.