Belirli bir dizeyi depodaki tüm Git ve Mercurial taahhütlerinde nasıl arayabilirim?


287

Birkaç şubesi ve sarkan taahhütleri olan bir Git depom var. Belirli bir dize için depodaki tüm taahhütleri aramak istiyorum.

Tarihteki tüm taahhütlerin günlüğünü nasıl alacağımı biliyorum, ancak bunlar dalları veya sarkan lekeleri değil, sadece HEAD'in tarihini içeriyor. Hepsini almak, yanlış yere yerleştirilmiş belirli bir taahhüt bulmak istiyorum.

Ayrıca geçişi düşündüğüm için bunu Mercurial'ta nasıl yapacağımı bilmek istiyorum.


Yanıtlar:


331

İle sarkan taahhütleri görebilirsiniz git log -g.

-g, --walk-reflogs
 Instead of walking the commit ancestry chain, walk reflog entries from
 the most recent one to older ones. 

Böylece bunu yapan bir tamamlama iletisinde belirli bir dizeyi bulmak için yapabilirsiniz:

git log -g --grep=search_for_this

Alternatif olarak, belirli bir dize için değişiklikleri aramak isterseniz, kazma arama seçeneğini "-S" kullanabilirsiniz:

git log -g -Ssearch_for_this
# this also works but may be slower, it only shows text-added results
git grep search_for_this $(git log -g --pretty=format:%h)

Git 1.7.4 , -G seçeneğini ekleyerek <regexp> içeren bir satırın ne zaman taşındığını bulmak için -G <regexp> 'i iletmenizi sağlar; -S size sadece dizeyi içeren toplam satır sayısı değiştiğinde (yani dizeyi eklerken / kaldırırken) söyleyecektir.

Son olarak, sarkan taahhütleri görselleştirmek için gitk'i kullanabilirsiniz:

gitk --all $(git log -g --pretty=format:%h)

Ve sonra yanlış yerleştirilmiş dosyayı aramak için arama özelliklerini kullanın. Tüm bu çalışmalar, eksik taahhüdün "sona ermediğini" ve çöp toplandığını varsayar; bu, 30 gün boyunca sarkıyorsa ve reflog'ların süresinin dolması veya süresi dolan bir komut çalıştırmanız durumunda ortaya çıkabilir.


4
Belki bir projenin herhangi bir yerinde 'search_for_this' olan tüm taahhütleri bulan (muhtemelen büyük) sayıda komisyonda "git grep" çalıştırmak yerine, "kazma" araması, yani "log" , verilen dizeyi getiren veya silmiş olan taahhütleri bulur veya belirli bir dizenin oluşum sayısının değiştiği yerde daha kesin olur.
Jakub Narębski

5
Birden çok dal belirtebilir veya '--all' seçeneğini kullanabilirsiniz, örneğin, bir tamamlama iletisinde 'git log --grep = "dize" --all'
Jakub Narębski

Bu sadece 2 günlük çalışma için kayıp bir taahhüt bulmama izin verdi. Tamamen kıçımı kurtardı, teşekkürler!
Mike Chamberlain

2
Ben veritabanımda taahhüt ama reflog değil bazı durumlarda rastladım. Bunun ne kadar yaygın olduğunu bilmiyorum. Farklı hg / git köprülerini deniyordum. Bence düşmüş zıvanalarla da ortaya çıkabilir. Her durumda, bu takma ad, bu davaları yakalamak için güzel çalışıyor:!git fsck --unreachable | sed -ne 's/^unreachable commit //p' | xargs git log --no-walk
dubiousjim

Not, arama notu nesnelerini içermez. Bu henüz uygulanmadı: git.661346.n2.nabble.com/…
Antony Stubbs

54

Mercurial'ta hg log --keyword, taahhüt iletilerindeki anahtar kelimeleri hg log --useraramak ve belirli bir kullanıcıyı aramak için kullanılır. hg help logGünlüğü sınırlamanın diğer yolları için bakın .


36
Josip, Mercurial'a geçmeyi düşündüğünü ve orada nasıl yapıldığını duymak istediğini yazdı.
Martin Geisler

1
hg log -karamalar, hg'de anlamadığım birkaç şeyden biri olan değişiklikler kümesinde kullanıcı adını ve dosya adlarını da değiştirir (commands.py:log'da görüyorum). İşleme iletilerini ve dosya adlarını aramak için ayrı seçenekler bulunmalıdır. hg log --template '{desc}\n'|grepKesin bir yol gibi görünüyor .
Geoffrey Zheng

@GeoffreyZheng: Bunu yapmanın yolları var. Bkz. "Hg help revsets", esp desc (), user () ve file () işlevleri. Bu davranışların çoğu için hg günlük anahtarları da vardır. Deneyimlerime göre, -k / keyword () genellikle bir şeyleri aramanın en yararlı yoludur.
Kevin Horn

Biri gerçek taahhütlü dosya içeriği ile nasıl arama yapar? Diffs? Yavaş bir arama olacağını biliyorum, ancak eksik bir işlev adı için derin bir arama yapmak istiyorum.
Jonathan

Oh işte burada:hg grep --all <term>
Jonathan

24

Ek olarak RichQ cevap kullanmanın git log -g --grep=<regexp>ya git grep -e <regexp> $(git log -g --pretty=format:%h): Junio C Hamano, şimdiki git sağlayıcı tarafından aşağıdaki blog yayınlarına bakabilirsiniz


özet

Hem git grep ve --grep git günlüğü edilir hat yönelimli onlar desen belirtilen eşleşen satırları arayın ki.

Sen kullanabilirsiniz git log --grep=<foo> --grep=<bar>(ya da git log --author=<foo> --grep=<bar>o içten ikiye çevirir --grepmaç kaydedilmesini bulmak için) ya örtük (kalıplarının VEYA anlamsal) ).

Hat odaklı olmanın Çünkü kullanışlı VE semantik kullanmaktır git log --all-match --grep=<foo> --grep=<bar>bulmak için taahhüt olduğunu vardır hem ilk satır eşleme ve çizgi ikinci bir yerlerde uyan.

İle git grepBirden desenleri (kullanması gereken tüm birleştirebilirsiniz -e <regexp>formu) --or(varsayılan), --and, --not, (ve ). Çünkü grep --all-match, dosyanın her alternatifle eşleşen satırlara sahip olması gerektiği anlamına gelir .


Hey Jakub, bu blog yazılarındaki alıntıları / özetleri birleştirmeye ne dersiniz? Şu anda yalnızca vintage bağlantı yanıtlarından biri gibi görünüyor.
Nathan Tuggy

11

Rq'nin cevabına dayanarak, bu hattın istediğimi yaptığını buldum:

git grep "search for something" $(git log -g --pretty=format:%h -S"search for something")

Bu, taahhüt kimliğini, dosya adını bildirir ve eşleşen satırı şu şekilde görüntüler:

91ba969:testFile:this is a test

... Herkes bunun standart git grep komutuna dahil olmak için iyi bir seçenek olacağını kabul ediyor mu?


5

Başvuruları bağımsız değişken olarak alan herhangi bir komut --all, man sayfasında belgelenen seçeneği git rev-listaşağıdaki gibi kabul eder:

   --all
       Pretend as if all the refs in $GIT_DIR/refs/ are listed on the
       command line as <commit>.

Örneğin git log -Sstring --all, söz konusu stringve bir şubeden veya bir etiketten erişilebilen tüm taahhütleri gösterecektir (sarkan taahhütlerinizin en azından bir etiketle adlandırıldığını varsayıyorum).


3
Bu için durum görünmüyor git grep, --allolarak kullanılan / tercüme olsun görünmektedir --all-match. Bu benim için bir hata gibi görünüyor .. Git 1.7.2.3 kullanarak ( $(git rev-list --all)works kullanarak ).
blueyed

5

Mercurial ile bir

$ hg grep "search for this" [file...]

Aranan düzeltme aralığını daraltan başka seçenekler de vardır.


1
Bayrağı da severimhg grep --all
Jonathan

2

Git'i bilmiyorum, ama Mercurial'ta aradığın şeyi aramak için hg log çıktısını bazı sed / perl / herhangi bir betiğe bağlarım. İsterseniz, aramayı kolaylaştırmak için bir şablon veya stil kullanarak hg günlüğünün çıktısını özelleştirebilirsiniz.

Bu, repodaki tüm adlandırılmış dalları içerecektir. Mercurial'ın sarkan lekeler afaik gibi bir şeyi yoktur.


1
Bu cevabın belirtilen problemle nasıl alakalı olduğunu anlamıyorum.
jribeiro

3
Orijinal sorunun son paragrafta sorduğu Mercurial sorusuna bir cevap.
Kurt Schelfthout


1

Henüz bahsedilmeyen bir çözüm daha eklemek için gitg'in grafik arama kutusunu kullanmanın benim için en basit çözüm olduğunu söylemek zorundaydım. İlk olayı seçer ve Ctrl-G ile sonrakini bulabilirsiniz.


1

Git bir komut bir dize bulmak çok daha kolay olduğunu düşünüyorum:

git log --pretty=oneline --grep "string to search"

Git 2.0.4'te çalışır

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.