Subversiyon geçmişini arama (tam metin)


135

Tüm geçmiş de dahil olmak üzere bir alt sürüm havuzunun tam metin aramasını yapmanın bir yolu var mı?

Örneğin, bir yerde kullandığım bir özellik yazdım, ancak daha sonra gerekli değildi, bu yüzden dosyaları rm'd, ama şimdi başka bir şey için kullanmak için tekrar bulmam gerekiyor. SVN günlüğü muhtemelen "kullanılmayan şeyleri kaldırıldı" gibi bir şey söylüyor ve böyle bir sürü checkin var.

Edit 2016-04-15: Lütfen burada "tam metin arama" terimi tarafından sorulan şeyin dosya adlarını ve / veya taahhüt mesajlarını değil, kayıt geçmişinin gerçek farklarını aramak olduğunu unutmayın . Bunu işaret ediyorum çünkü yazarın yukarıdaki ifadesi çok iyi yansıtmıyor - çünkü örneğinde sadece bir dosya adı ve / veya taahhüt mesajı arıyor olabilir. Bu nedenle birçok svn logcevap ve yorum.


6
Apache Subversion 1.8 komut --searchiçin argümanı kabul eder svn log. Cevabımı stackoverflow.com/a/17473516/761095
bahrep

3
svn log --search@rjmunro tarafından gerektiği gibi tam metin araması yapmaz, yalnızca yazar, tarih, günlük iletisi ve değiştirilen yolların listesini arar.
zb226

Yanıtlar:


77
git svn clone <svn url>
git log -G<some regex>

1
İyi bir nokta. Gitk GUI bu tür bir aramayı çok iyi yapar ve bir svn deposuna erişmek için git svn araçlarını kullanmak kolaydır. Kuşkusuz, bu soruyu sorduğumdan beri tamamen git kullanmaya başladım, bu yüzden bu yanıtı kabul etmek bana biraz özgü olabilir.
rjmunro

4
Deponuzun boyutuna bağlı olarak bu işlem biraz zaman alabilir. Benim için bir saatten fazla sürdü.
user247702

20
Büyük bir SVN deposunu GIT'e dönüştürmek genellikle mümkün olmadığı veya çok uzun süreceği için bu çözümü reddettim. Bir C # dili yapısı hakkında soru sorulduğunda Java'yı önermek gibidir.
ooxi

3
Bu komut için ek bir paket yüklemeniz gerekebilir. Ubuntu'da, istiyorsun apt-get install git-svn.
Mart'ta

5
"Svn log --verbose --diff | grep ..." git kullanmanıza gerek kalmadan kabaca aynı işlevselliği satın almıyor mu?
lyte

41

svn logApache Subversion 1.8'de yeni bir --searchseçenek destekleniyor . Böylece, 3. parti araçlarını ve komut dosyalarını kullanmadan Subversion depo geçmişi günlük iletilerini arayabilirsiniz.

svn log --search yazar, tarih, günlük mesajı metni ve değiştirilen yolların listesini arar.

Bkz. SVNBook | svn logkomut satırı başvurusu .


7
Kullanışlı, ancak tam metin araması değil. Git-svn cevabına
sadık kalıyorum

4
Şu anda googlecode'daki svn depolarının hala svn 1.6 üzerinde çalışmakta olduğundan değil ... bkz: code.google.com/p/support/wiki/… ? Ancak, müşterinizin 1,8'e (ve herhangi bir teslim edilmiş repo svn yükseltmesine) güncellenmesi, svn günlüğünü kullanmanıza izin verecektir
repoda arama

Çalışan kopya tüm güncelleştirmelere ihtiyaç duyar, ancak bu komut revizyon numarası, değiştirilen dosyalar ve yorum dahil tüm değişikliği listeler. Tam metin nasıl değildir?
Bernhard Döbler


21

Küçük bir shellscript kullanıyorum, ama bu sadece tek bir dosya için çalışıyor. Tabii bunu daha fazla dosya eklemek için bul ile birleştirebilirsiniz.

#!/bin/bash
for REV in `svn log $1 | grep ^r[0-9] | awk '{print $1}'`; do 
  svn cat $1 -r $REV | grep -q $2
  if [ $? -eq 0 ]; then 
    echo "$REV"
  fi 
done

Gerçekten her şeyi aramak istiyorsanız, svnadmin dumpkomutu kullanın ve bunu grep.


"R" ile revizyon numaralarından kaldırmak zorunda kaldım: awk '{print substr ($ 1,2, length ($ 1))}' ve aslında eşleşmeleri göstermek için grep "-q" seçeneğini kaldırmak zorunda kaldım.
Hugo

dizeler myDump.txt | grep "turtle fwd 10"
jedierikb

2
Ve bu yüzden git'i kucaklıyoruz.
Sınırlı Kefaret

davayı görmezden gelmek için son grep
-i'yi yapmak

13

Bunu yapmanın en iyi yolu daha azıyla:

svn günlüğü --verbose | az

Daha az çıktı /alındığında, VIM gibi aramak için vurabilirsiniz .

Düzenle:

Yazara göre, sadece mesajlar ve dosya adlarından daha fazlasını aramak istiyor. Bu durumda getto kesmek gibi bir şeyle birlikte yapmanız gerekecek:

svn diff -r0:HEAD | less

Ayrıca grepsizin için arama yapmak yerine veya başka bir şey yapabilirsiniz. Bunu deponun bir alt dizininde kullanmak istiyorsanız, svn logdizinin bulunduğu ilk düzeltmeyi fark etmek ve bunun yerine bu düzeltmeyi kullanmak gerekir 0.


5
Tam metin araması değil, günlükleri ve dosya adlarını arıyor.
rjmunro

Bu durumda, daha etkileyici taahhüt günlükleri kullanmanız gerekir. Eğer revizyonlar arasındaki farkı grep etmek istiyorsanız, bu diğer tüm balmumu topu. Ve şahsen bunu yapmanın bir yolunu bilmiyorum.
Jack

> svn diff -r0: HEAD> log> daha az log benim seçimimdir. Teşekkürler
kingoleg


7
svn log -v [repository] > somefile.log

diff için --diffseçeneği kullanabilirsiniz

svn log -v --diff [repository] > somefile.log

daha sonra vim veya nano'yu veya ne istersen onu kullan ve aradığın şeyi ara. Çok çabuk bulacaksınız.

Süslü bir senaryo veya otomatik bir şey değil. Ama işe yarıyor.


AFAICS, Gerçek mesajları değil, taahhüt mesajları arayacaktır.
rjmunro

Sonra svn log -v --diff [repository]> somefile.log
JREN

6

Özgür olmasanız da, size JIRA'yı getiren aynı millet olan Atlassian'dan Balıkgözü'ne bir göz atabilirsiniz. Diğer birçok kullanışlı özellik ile SVN'ye karşı tam metin araması yapar.

http://www.atlassian.com/software/fisheye/


1
Balıkgözü oldukça iyi. Söylediğiniz gibi, ücretsiz değil, ancak <= 10 committer lisansı sadece 10 $ / yıl.
Jason S

Şu anda, 5 kullanıcı 10 ABD doları, ANCAK sadece 10 kullanıcı 1.000 $ atlar!
Mawg, Monica


4

Ben sadece bu problemle karşılaştım ve

svnadmin dump <repo location> |grep -i <search term>

işi benim için yaptı. İlk oluşumun revizyonu geri döndü ve aradığım çizgiyi alıntıladı.


1
Yalnızca yerel olarak çalışır ve bir havuz büyükse çok zaman alır.
bahrep

2

Onunla herhangi bir deneyimim yok, ama SupoSE (açık kaynak, Java ile yazılmış) tam olarak bunu yapmak için tasarlanmış bir araçtır.


2

svn log -l<commit limit> | grep -C<5 or more lines> <search message>


1

Genellikle Jack M'nin söylediklerini yaparım (svn log --verbose kullanın) ama daha az yerine grep için borularım .


5
Tam metin araması değil, günlükleri ve dosya adlarını arıyor.
rjmunro

Genelde bunu yapıyorum, ancak lessyorumda sadece satır yerine revizyonu, tarihi vb. Genellikle bu aradığım şeydir.
Jack

1

Bu sorunu çözmek için bunu bir cygwin bash betiği olarak yazdım.

Ancak, arama teriminin şu anda dosya sistemi dosyasında olmasını gerektirir. Dosya sistemi grep ile eşleşen tüm dosyalar için, o dosya için tüm svn diffs bir grep gerçekleştirilir. Mükemmel değil, ancak çoğu kullanım için yeterince iyi olmalıdır. Bu yardımcı olur umarım.

/ Usr / local / bin / svngrep

#!/bin/bash
# Usage: svngrep $regex @grep_args

regex="$@"
pattern=`echo $regex | perl -p -e 's/--?\S+//g; s/^\\s+//;'` # strip --args
if [[ ! $regex ]]; then
    echo "Usage: svngrep \$regex @grep_args"
else 
    for file in `grep -irl --no-messages --exclude=\*.tmp --exclude=\.svn $regex ./`;     do 
        revs="`svnrevisions $file`";
        for rev in $revs; do
            diff=`svn diff $file -r$[rev-1]:$rev \
                 --diff-cmd /usr/bin/diff -x "-Ew -U5 --strip-trailing-cr" 2> /dev/null`
            context=`echo "$diff" \
                 | grep -i --color=none   -U5 "^\(+\|-\).*$pattern" \
                 | grep -i --color=always -U5             $pattern  \
                 | grep -v '^+++\|^---\|^===\|^Index: ' \
                 `
            if [[ $context ]]; then
                info=`echo "$diff" | grep '^+++\|^---'`
                log=`svn log $file -r$rev`
                #author=`svn info -r$rev | awk '/Last Changed Author:/ { print $4 }'`; 

                echo "========================================================================"
                echo "========================================================================"
                echo "$log"
                echo "$info"
                echo "$context"
                echo
            fi;
        done;
    done;
fi

/ Usr / local / bin / svnrevisions

#!/bin/sh
# Usage:  svnrevisions $file
# Output: list of fully numeric svn revisions (without the r), one per line

file="$@"
    svn log "$file" 2> /dev/null | awk '/^r[[:digit:]]+ \|/ { sub(/^r/,"",$1); print  $1 }'

Çaba için 'A'! (sadece git :) kullan)
Sınırlı Kefaret

-1

Belirli bir kod satırından hangi revizyonun sorumlu olduğunu belirlemeye çalışıyorsanız, muhtemelen şunları arıyorsunuz:

svn blame

Kredi bilgileri: original answer


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.