Git: Tüm çeşitli değişiklikleri, git geçmişinin tamamında belirtilen bir dosyada tek bir satırda göster


112

Etrafıma baktım ve bunun mümkün olup olmadığından emin değilim, ama burada:

Bir değişkene atanmış benzersiz bir tanımlayıcım olan bir (javascript) dosyam (/lib/client.js deyin) var, örneğin: var identifier = "SOME_IDENTIFIER";

Tanımlayıcıyı bir sürüm numarası gibi düşünebilirsiniz: Periyodik olarak, bu değişkeni yeni bir tanımlayıcıyla değiştireceğiz.

Yapmak istediğim şey, şimdiye kadar kullandığımız tüm benzersiz tanımlayıcıları bulmak. Bunu git ile nasıl yapabilirim?

Git geçmişinde arama yapmanın ve satır eşleşmesini yazdırmanın bir yolu olabileceğini düşünüyorum "var identifier =". Bu listeyi manuel olarak çözebilirim.

Her neyse, burada her türlü görüşe minnettar olurum. Teşekkürler.


Yanıtlar:


106

1.8.4 sürümünden bu yana , sorunuzu yanıtlamanın daha doğrudan bir yolu var.

110Bu satırın söyleyen satır olduğunu varsayarsak, şunu yapın var identifier = "SOME_IDENTIFIER";:

git log -L110,110:/lib/client.js

Bu, o kod satırına dokunan her kaydı döndürecektir.

[ Git Belgeleri ("-L" komut satırı parametresine bakın)]


49

İçin man sayfasına bakın git-logve gitdiffcore. Bu komutun yapacağına inanıyorum, ancak tam olarak doğru olmayabilir:

git log -G "var identifier =" file.js

DÜZENLEME: İşte gerçek satırları gösterecek bir bash betiği için kaba bir başlangıç. Bu aradığınız daha fazla olabilir.

for c in $(git log -G "something" --format=%H -- file.js); do
    git --no-pager grep -e "something" $c -- file.js
done

Bir commit hash listesi oluşturmak için git log -Gkullanarak ilginç commit'leri bulmak için kullanılır --format=%H. Daha sonra, her ilginç commit üzerinde yineleyerek git grep, bu commit'den satırları ve commit hash ile başlayan regex'i içeren dosyanın gösterilmesini ister.


DÜZENLEME: Yorumlarda önerildiği gibi kullanmak -Gyerine değiştirildi -S.


@Rob - Bunun için teşekkürler - küçük düzenlemek Betiğinize olsa - sadece bu dosyayı etkilemez sadece dosya adı sadece gösterileri kaydedilmesini koyarak - bir diğer dosyaları başvurulan kesinleştirme eğer listede yok
Adrian Cornish

@AdrianCornish - Yardımcı olduğuna sevindim. Bence OP sadece bir dosyaya bakmak istedi, ancak dosya adını kaldırmanın muhtemelen daha genel olarak kullanışlı bir komut dosyası olduğu konusunda oldukça haklısınız.
soymak

Daha zor bir durumum var. Söz konusu dosya paht_a / file'dan path_b / file'a taşındı. Şimdi bunu path_b'de yaptığımda, yalnızca dosyanın path_a'dan path_b'ye hareket ettiği zamana kadar olan değişiklikleri gösteriyor. Bunu path_a'da yaparsam bana ölümcül: belirsiz argüman 'dosya' diyor: bilinmeyen revizyon veya çalışma ağacında olmayan yol.
Andy Şarkı

@AndySong - Aradığınız dize yeterince benzersizse, belki de dosya adını bırakıp yine de aradığınızı alabilirsiniz.
soymak

Benim için daha uygun oldu - her kaydetmeden sonra bir satır boşluk bırakın, satırları numaralandırın: sfile=path/to/some_file; sfind='string_to_find'; for c in $(git log -G $sfind --format=%H -- $sfile); do git --no-pager grep -e $sfind -n $c -- $sfile; echo; done
kayıttan koyun

14

Bunu gitk ile de yapabilirsiniz:

gitk file.js

"Kaydetme" açılır menüsünde, "dize ekleme / kaldırma:" seçeneğini seçin ve yanındaki metin kutusuna "var identifier =" girin ve bu dizeyi içeren satırları ekleyen veya kaldıran tüm işlemeler vurgulanacaktır.


Bu, "var identifier =" içeren satırın eklendiği kesinlemeyi saptamaya yardımcı oldu, ancak bu satırı değiştiren sonraki işlemleri göstermiyor.
findchris

2
Eğer denedin git blame file.jsya git gui blame file.js?
Ethan Brown

1
Git suçlamanın ne yaptığını biliyorum; Tek bir fark değil, tam bir revizyon geçmişi arıyorum.
findchris

1
git gui blame file.jsbunu yapacak ... size bir dosyanın tüm revizyonlarını ve onu kimin değiştirdiğini gösterecek; geçmişte geriye doğru tıklayabilirsiniz.
Ethan Brown

Gitk ile görsel olarak adım attım. Sanırım bunu yapacak zarif bir teknik var, ama gitk yeterince iyiydi. Teşekkürler.
findchris

9

@ Rob'un cevabını biraz git loguyarlarsanız, ihtiyacınız olan tek şey görsel bir karşılaştırma ise temelde bunu sizin için yapacaktır:

git log -U0 -S "var identifier =" path/to/file

-U0 yama modunda çıktı anlamına gelir (-p ) çevresinde sıfır bağlam satırı gösterir.

Bunu şubeler arasında bile yapabilirsiniz:

git log -U0 -S "var identifier =" branchname1 branchname2 -- path/to/file

Dif başlığını bastırmanın bir yolu olabilir, ancak ben bir tane bilmiyorum.


Benim için çalıştı! Teşekkürler.
Roberto Bonini

3

In magit , sen ile yapabilirsiniz

l, =L

Daha sonra sizden dosya ve başlangıç, bitiş satırları isteyecektir.

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.