Git tek bir dosya geçmişinde dize arar


173

Yani foo.rb adlı bir dosya varsa ve bana bar adlı eksik bir yöntem için bir hata veriyorsa , bu yüzden geçmişte tanımlanmış olup olmadığını görmek için foo.rb geçmişinde dizeyi aramak istiyorum bar.

Bir arama için tüm Git geçmişini aradım ?

Ancak bu tüm dosyaları arar. Sadece bir dosyada arama yapmak istiyorum.


6
Tıpkı bir FYI gibi, -- filenamebir dosyaya sınırlamak istiyorsanız bir sürü git komutuna ekleyebilirsiniz .
Karl Bielefeldt

Yanıtlar:


235

Bu amaçla -S seçeneğini kullanarak log günlüğüne gidebilirsiniz:

git log -S'bar' -- foo.rb

39
Ya da git log -G'bar' -- foo.rb'bar' oluşum sayısını değiştiren taahhütler yerine 'bar' içeren farkları aramak için (bkz. Git-log manpage).
Jakub Narębski

1
Tırnaklar için benim için işe yaramadı, bar-Sbar aramak için kullanmak zorunda kaldım . Belki de Windows komut satırını kullanarak benimle ilgisi vardır.
zbr

başka bir deyişle, -Gnormal ifade araması için ... bu da büyük bir referans: stackoverflow.com/a/4472267/2586761
ptim 24:17 '

17

Ya da belki bunu deneyebilirsiniz (ilgili sorulardan Git için tüm geçmişte arama yapın )

git rev-list --all foo.rb | (
    while read revision; do
        git grep -F 'bar' $revision foo.rb
    done
)

Aslında dosya içeriğini arayacak ve çubuğun herhangi bir oluşumu için mesaj / yamalar işlemeyecektir.


Windows için: for /F %i in ('git rev-list --all foo.rb') git grep -F bar %i foo.rb(dosya adı veya arama ifadesi boşluk
içeriyorsa

1
Windows'ta benim için "do" olmadan çalışmadı: for /F %i in ('git rev-list --all foo.rb') do git grep -F bar %i foo.rb (dosya adı veya arama ifadesi boşluk
içeriyorsa

2

Git log komutu için bir geçersiz kılma var ( manuelden ):

$ git log Makefile      # commits that modify Makefile

Böylece şunları kullanabilirsiniz:

git log foo.rb | grep "bar"

2
Teşekkürler, ancak bu yalnızca dosyanın kaynağının geçmişini değil, taahhüt geçmişini arar.
JD Isaacks

2
Aslında, dize veri değişikliğini arayan başka bir geçersiz kılma var: git log -S'foo () '#,' foo () 'dizesiyle eşleşen dosya verilerini ekleyen veya kaldıran taahhütler
Dmitry Reznik

1
--Full-diff parametresini kullanmayı da deneyebilirsiniz. Günlükler sadece taahhüt tarihini göstermekle kalmaz, aynı zamanda farkları da gösterir.
Dmitry Reznik

@DmitriyReznik - görünüşe göre --full-diffçalışmıyor (olduğu gibi, fark gösterilmiyor) olmadan -p, en azından git 1.7.9.5
sdaau

0

git log -S "string" --follow -p "path of file"Bu dize ile tüm değişikliklerin tam geçmişini gösteren kullandım .

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.