Git belirli bir kelime için farklılıklar veya içerikler nasıl anlaşılır?


622

Git kod deposunda, belirli bir kelimeyi içeren tüm taahhütleri listelemek istiyorum. Bunu denedim

git log -p | grep --context=4 "word"

ancak dosya adını geri vermeyebilir (aradığım kelimeden 5 satır daha az olmadığı sürece.

git grep "word"

ama bana sadece mevcut dosyaları veriyor, geçmişi değil.

Belirli bir kelimedeki değişiklikleri takip edebilmek için tüm geçmişi nasıl arayabilirim? Ben kod tabanı değişiklikleri izlemek için kelime oluşumları için arama niyetinde (dosya geçmişinde arama).


Yanıtlar:


905

Teslim mesajının verilen kelimeyi içerdiği tüm taahhütleri bulmak istiyorsanız ,

$ git log --grep=word

Dosya içeriğinde "word" ifadesinin eklendiği veya kaldırıldığı tüm taahhütleri bulmak istiyorsanız (daha kesin olmak gerekirse : "word" kelimesinin gerçekleşme sayısının değiştiği yer), yani taahhüt içeriğinde arama yapmak için 'kazma' araması ile

$ git log -Sword

Modern git'te ayrıca

$ git log -Gword

eklenen veya kaldırılan satır "kelime" ile eşleşen farklılıkları aramak için (ayrıca içeriği taahhüt ).

Not -Gvarsayılan olarak ise, bir normal ifade kabul -Sbir dize kabul eder, ancak kullanarak Regexes kabul etmek değiştirilebilir --pickaxe-regex.

Arasındaki farkı göstermek için -S<regex> --pickaxe-regexve -G<regex>bir aynı dosyada aşağıdaki fark ile taahhüt göz önünde bulundurun:

+    return !regexec(regexp, two->ptr, 1, &regmatch, 0);
...
-    hit = !regexec(regexp, mf2.ptr, 1, &regmatch, 0);

git log -G"regexec\(regexp"Bu taahhüdü gösterecek olsa da, git log -S"regexec\(regexp" --pickaxe-regexolmayacak (çünkü o dizenin gerçekleşme sayısı değişmedi).


Git 2.25.1 (Şubat 2020) ile dokümantasyon bu normal ifadeler etrafında netleştirilir.

Bakınız Martin Ågren (``) tarafından 9299f84 (06 Şub 2020) taahhüdü . (Göre Birleştirilmiş - Junio Cı Hamano - içinde 0d11410 tamamlama 2020 12 Şubat)
gitster

diff-options.txt: örnekte "normal ifade" aşırı yüklenmesinden kaçının

Rapor eden: Adam Dinwoodie
İmzalayan: Martin Ågren
İnceleyen: Taylor Blau

-GVe -S(kullanarak --pickaxe-regex) arasındaki farkı örneklediğimizde, bunu git diff"regexec", "regexp", "regmatch", ...

Örnek doğrudur, ancak gerçekten ifade etmemiz gerekmedikçe "regex. *" Yazmaktan kaçınarak çözmeyi kolaylaştırabiliriz.

Bunun yerine bazı düzenli, normal olmayan kelimeler kullanın.

git diffDokümantasyon şimdi içerir:

Arasındaki farkı göstermek için -S<regex> --pickaxe-regexve -G<regex>bir aynı dosyada aşağıdaki fark ile taahhüt göz önünde bulundurun:

+    return frotz(nitfol, two->ptr, 1, 0);
...
-    hit = frotz(nitfol, mf2.ptr, 1, 0);

git log -G"frotz\(nitfol"Bu taahhüdü gösterecek olsa da, git log -S"frotz\(nitfol" --pickaxe-regexolmayacak (çünkü o dizenin gerçekleşme sayısı değişmedi).


3
@TankorSmash -S<string><string> örneğini tanıtan veya kaldıran farklılıkları arayın. -G<string>Eklenen veya kaldırılan satır verilen <regex> ile eşleşen farklılıkları arayın.
m-ric

1
@ m-ric Görüyorum, tek bir dize örneği, bütün bir satıra karşı! Teşekkürler
TankorSmash

3
@ m-ric, @TankorSmash: Fark -S<string>daha hızlıdır, çünkü aramalar her komut farkında satır eklenir ve kaldırılırken yalnızca <string>değiştirilen örneklerin sayısının değişip değişmediğini kontrol eder -G<string>.
Jakub Narębski

3
Aralarında boşluk olan kelimeleri aramanız gerekiyorsa git log --grep="my words",.
MEM

4
@ MEM, ve öğelerinden --grepfarklıdır . Dizeyi bu bağımsız değişkenlerin her birine alıntılayabilirsiniz. -S-G
Acumenus

255

git logadlı kullanıcının kazması, "word" git log -Sword


60
Bu tamamen kesin değil. -S <string> <string> örneğini tanıtan veya kaldıran farklılıkları arayın. Bunun diff çıktısında görünen dizeden farklı olduğunu unutmayın;
timtam

4
Bu genellikle doğru cevap olsa da, sadece diğerlerini 3 farklı yolu olan ve inceliklerini açıklayan bu cevabı ( stackoverflow.com/a/1340245/586983 ) okumaya teşvik etmek için indirgendim .
jakeonrails

18
Allah Allah! Bunun doğru bir cevabı küçümsemek için iyi bir neden olduğunu düşünmüyorum ... Bir yoruma link eklemek yeterli cesaret olacaktır emin değil misiniz?
Deborah

@jakeonrails, Bu cevap bu (daha eski) cevap için bir düzenleme olmalı, bu yüzden bu can sıkıcı kopyalarımız yok. Ancak insanlar temiz cevaplar sayfası yerine sadece saygınlık ister.
Iulian Onofrei

22

Bir çok denemeden sonra, verilen bir normal ifadeyi içeren satırları tanıtan veya kaldıran taahhütleri gösteren ve her birindeki metin değişikliklerini gösteren ve eklenen ve kaldırılan sözcükleri gösteren renkleri içeren aşağıdakileri önerebilirim.

git log --pickaxe-regex -p --color-words -S "<regexp to search for>"

Gerçi çalıştırmak biraz zaman alır ... ;-)


2
Bu şimdiye kadarki en iyilerinden biri teşekkürler. İpucu: tüm sonuçları disk belleği olmadan listelemek için, ya komutun başına GIT_PAGER=catekleyin veya ekleyin| cat
Zack Morris

Bir yol belirtin veya dosya çok daha hızlı olacaktırgit log --pickaxe-regex -p --color-words -S "<regexp to search for>" <file or fiepath>
fangxing

10

Aşağıdaki komutu deneyebilirsiniz:

git log --patch --color=always | less +/searching_string

veya grepaşağıdaki şekilde kullanarak :

git rev-list --all | GIT_PAGER=cat xargs git grep 'search_string'

Bu komutu aramak istediğiniz üst dizinde çalıştırın.


2
Bu yöntemi seviyorum, çünkü baktığım taahhütlerin yüzlerce satır ilgisiz değişikliği var ve sadece aradığım kelimeyi içeren gerçek yamalar ile ilgileniyorum. Renk kullanımı elde etmek için git log --patch --color=always | less +/searching_string.
Radon Rosborough

9

Bunu yapmanın bir yolu / sözdizimi şöyledir: git log -S "word"
Bunun için örneğingit log -S "with whitespaces and stuff @/#ü !"



1

Normal ifadede boolean bağlayıcı kullanmak için:

git log --grep '[0-9]*\|[a-z]*'

Bu normal ifade, tamamlama mesajlarında normal ifade [0-9] * veya [az] * arar.


-1

Git verilerinizden kaldırmak için hassas verileri aramak istiyorsanız (bu yüzden buraya inmemin nedeni), bunun için araçlar var. Github, bu sorun için ayrılmış bir yardım sayfası olarak .

İşte makalenin özü:

BFG Repo-Temizleyici istenmeyen verileri kaldırmak için git filtre-dalı için daha hızlı, daha basit bir alternatiftir. Örneğin, dosyanızı hassas verilerle kaldırmak ve en son taahhüdünüze dokunmamak için) çalıştırın:

bfg --delete-files YOUR-FILE-WITH-SENSITIVE-DATA

Passwords.txt dosyasında listelenen tüm metni deponuzun geçmişinde bulabileceğiniz her yerde değiştirmek için şunu çalıştırın:

bfg --replace-text passwords.txt

Bkz BFG Repo-Cleaner belgelerine tam kullanımı ve indirme talimatları için.


Bu yanıtı burada değil stackoverflow.com/questions/872565/… adresine eklemek isteyebilirsiniz
lacostenycoder
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.