Herhangi bir dalda bir dize tanıtan Git taahhüdü nasıl bulunur?


396

Herhangi bir dalda herhangi bir taahhüt tanıtılan belirli bir dize bulmak istiyorum, bunu nasıl yapabilirim? Bir şey buldum (Win32 için değiştirdim), ancak git whatchangedfarklı dallara bakıyor gibi görünmüyor (py3k yığınını görmezden gel, sadece bir msys / win line feed fix)

git whatchanged -- <file> | \
grep "^commit " | \
python -c "exec(\"import sys,msvcrt,os\nmsvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)\nfor l in sys.stdin: print(l.split()[1])\")" | \
xargs -i% git show origin % -- <file>

Çözümünüzün yavaş olması gerçekten önemli değil.


Yanıtlar:


685

Yapabilirsin:

git log -S <whatever> --source --all

Sabit dizeyi ekleyen veya çıkaran tüm taahhütleri bulmak için whatever. --allParametre araçları her dalına ve başlamak --sourcetaahhüt bulgusuna yol açmıştır bu dalların hangi göstermek için araçlar. Bu -ptaahhütlerin her birinin de sunacağı yamaları göstermek için eklemek genellikle yararlıdır .

1.7.4'ten beri git sürümleri de -Gdüzenli bir ifade alan benzer bir seçeneğe sahiptir . Aslında Junio ​​Hamano'nun bu blog yazısında açıklanan farklı (ve daha açık) anlambilimleri var .

Gibi thameera Açıklamalarda noktaları, bunu örneğin boşluk veya diğer özel karakterleri içeriyorsa arama terimi tırnak koymak gerekir:

git log -S 'hello world' --source --all
git log -S "dude, where's my car?" --source --all

Aşağıda yer alan örnekleri -Gbulmak için kullanılan bir örnek verilmiştir function foo() {:

git log -G "^(\s)*function foo[(][)](\s)*{$" --source --all

19
Mükemmellik için +1. -S'ye işaret etmek bir şey, şeyleri açıklamak, daha iyi. Ayrıca, şeylerin hangi şubelerden geldiğini görmek için --derate'i kullanmayı seviyorum
sehe

7
@sehe: Güzel yorumunuz için teşekkürler. Sanırım --decorateher dalın ucundaki taahhüde sadece şube adını eklediğini belirtmek gerekir . Uygulamada Gerçekten kullanmayın --sourceveya --decorateve bunun yerine kullanmak git branch -a --contains <commit-hash>benim ilgilendiğim taahhüt içeren dalları bulmak.
Mark Longair

3
satır içi farkını görmek için -p ekleyin, FWIW
rogerdpack 5:14

1
@ MarkLongair birleşmede yapılan değişiklikleri göstermez. Bunları da göstermek için herhangi bir öneriniz var mı?
Pahlevi Fikri Auliya

2
Benim için bu sadece -S ve arama terimi arasındaki boşluğu kaldırırsam işe yarar git log -S"dude, where's my car?" --source --all. @ribamar da bunu aşağıdaki cevapta yazdı , ancak bu üst yanıtın yanında kolayca gözden kaçabilir.
bug313


20

Mark Longair'in cevabı mükemmel, ama benim için çalışmak için bu daha basit versiyonu buldum.

git log -S whatever

24
Sadece açıklığa kavuşturmak için, aradığınız taahhüt varsa, bu iyi çalışır HEAD, ancak bu özel soru özellikle bir depodaki tüm şubelere bakmak hakkında sordu.
Mark Longair

18

Aynı cevaplarla uğraşmak:

$ git config --global alias.find '!git log --color -p -S '
  • ! çünkü başka bir yolla git argümanı -S'ye doğru iletmez. Bu yanıta bakın
  • --color ve -p tam olarak "değişmiş" ifadeyi göstermeye yardımcı olur

Şimdi yapabilirsin

$ git find <whatever>

veya

$ git find <whatever> --all
$ git find <whatever> master develop

6
git log -S"string_to_search" # options like --source --reverse --all etc

S ve "string_to_search" arasında boşluk olmamasına dikkat edin. Bazı kurulumlarda (git 1.7.1), şöyle bir hata alırsınız:

fatal: ambiguous argument 'string_to_search': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions

2

Bu size doğrudan sorunuzu cevaplamasa da, gelecekte sizin için iyi bir çözüm olabileceğini düşünüyorum. Kodumun bir kısmını gördüm, ki bu kötü oldu. Kimin ne zaman yazdığını bilmiyordum. Dosyadaki tüm değişiklikleri görebiliyordum, ancak kodun başka bir dosyadan bu dosyaya taşındığı açıktı. İlk başta kimin eklediğini bulmak istedim.

Bunu yapmak için, günahkarı bulmama izin veren Git bisect'i kullandım .

Ben koştum git bisect startve sonra git bisect bad, çünkü gözden geçirilmiş revizyon sorunu vardı. Sorunun ne zaman ortaya çıktığını bilmediğim için, "iyi" için ilk taahhüdü hedefledim git bisect good <initial sha>.

Sonra sadece kötü kod için repo aramaya devam etti. Onu bulduğumda koştum git bisect badve orada olmadığında git bisect good.

~ 11 adımda, ~ 1000 taahhütte bulunmuştum ve sorunun tanıtıldığı kesin taahhüdü buldum. Oldukça iyi.


2

Kabul edilen cevabın çevremde neden çalışmadığından emin değilim, sonunda ihtiyacım olanı almak için komutun altında koşuyorum

git log --pretty=format:"%h - %an, %ar : %s"|grep "STRING"
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.