Mencari riwayat subversi (teks lengkap)

135

Apakah ada cara untuk melakukan pencarian teks lengkap dari repositori subversi, termasuk semua sejarahnya?

Sebagai contoh, saya telah menulis fitur yang saya gunakan di suatu tempat, tetapi kemudian tidak diperlukan, jadi saya mencari file-file itu, tetapi sekarang saya perlu menemukannya lagi untuk menggunakannya untuk hal lain. Log svn mungkin mengatakan sesuatu seperti "menghapus barang yang tidak digunakan", dan ada banyak checkin seperti itu.

Sunting 2016-04-15: Harap dicatat bahwa apa yang ditanyakan di sini oleh istilah "pencarian teks lengkap", adalah untuk mencari perbedaan aktual dari komit, dan bukan nama file dan / atau pesan komit . Saya menunjukkan ini karena frasa penulis di atas tidak mencerminkan dengan sangat baik - karena dalam contohnya ia mungkin hanya mencari nama file dan / atau melakukan pesan. Makanya banyak svn logjawaban dan komentar.

rjmunro
sumber
6
Apache Subversion 1.8 menerima --searchargumen untuk svn logperintah. Lihat jawaban saya di stackoverflow.com/a/17473516/761095
bahrep
3
svn log --searchtidak melakukan pencarian teks lengkap seperti yang disyaratkan oleh @rjmunro, tetapi hanya mencari penulis, tanggal, pesan log, dan daftar jalur yang diubah.
zb226

Jawaban:

77
git svn clone <svn url>
git log -G<some regex>
luis gutierrez
sumber
1
Poin yang bagus. Gitk GUI melakukan pencarian seperti ini dengan sangat baik, dan mudah untuk menggunakan alat git svn untuk mengakses repositori svn. Diakui, saya sudah sepenuhnya beralih ke menggunakan git sejak saya mengajukan pertanyaan ini, jadi menerima jawaban ini mungkin sedikit spesifik bagi saya.
rjmunro
4
Maklum, ini bisa memakan waktu cukup lama tergantung pada ukuran repositori Anda. Bagi saya butuh lebih dari satu jam.
user247702
20
Saya menurunkan solusi ini karena mengubah repositori SVN besar ke GIT seringkali tidak layak atau akan memakan waktu terlalu lama. Ini seperti merekomendasikan Java ketika memiliki pertanyaan tentang konstruksi bahasa C #.
ooxi
3
Anda mungkin perlu menginstal paket tambahan untuk perintah ini. Di Ubuntu, Anda mau apt-get install git-svn.
nedned
5
Bukankah "svn log --verbose --diff | grep ..." membeli fungsi yang kira-kira sama tanpa harus menggunakan git?
lyte
41

svn logdi Apache Subversion 1.8 mendukung opsi baru--search . Jadi, Anda dapat mencari pesan log riwayat repositori Subversion tanpa menggunakan alat dan skrip pihak ketiga.

svn log --search mencari di penulis, tanggal, log pesan teks dan daftar jalur yang diubah.

Lihat SVNBook | svn logreferensi baris perintah .

bahrep
sumber
7
Pencarian praktis, tetapi bukan teks lengkap. Saya tetap dengan jawaban git-svn :-)
rjmunro
4
Bukan berarti saat ini svn repo di googlecode masih berjalan di svn 1.6 ... lihat: code.google.com/p/support/wiki/… ? Namun, memperbarui klien Anda menjadi 1,8 (dan meningkatkan versi repo apa pun yang diperiksa) akan memungkinkan Anda untuk menggunakan log svn --selidiki di repo ...
Mario Ruggier
Salinan kerja membutuhkan semua pembaruan tetapi perintah ini mencantumkan seluruh perubahan termasuk nomor revisi, file yang diubah, dan komentar. Bagaimana ini bukan teks lengkap?
Bernhard Döbler
24

Jika Anda menjalankan Windows lihatlah di SvnQuery . Ini memelihara indeks teks lengkap dari repositori lokal atau jarak jauh. Setiap dokumen yang pernah berkomitmen pada repositori akan diindeks. Anda dapat melakukan kueri seperti Google dari antarmuka web sederhana.

Christian Rodemeyer
sumber
Akan lebih bagus jika SvnQuery masih dipertahankan tetapi sayangnya itu mati dan sekarang tidak berfungsi sama sekali.
Dan Atkinson
Saya menemukan klon yang berfungsi (?) Di github.com/kalyptorisk/svnquery/releases
Philip Helger
21

Saya menggunakan shellscript kecil, tetapi ini hanya berfungsi untuk satu file. Anda dapat menggabungkan ini dengan menemukan untuk menyertakan lebih banyak file.

#!/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

Jika Anda benar-benar ingin mencari semuanya, gunakan svnadmin dumpperintah dan coba menerimanya.

Bas Grolleman
sumber
Saya harus menghapus "r" dari angka revisi dengan: awk '{print substr ($ 1,2, length ($ 1))}' dan menghapus opsi grep "-q", untuk benar-benar menunjukkan kecocokan.
Hugo
string myDump.txt | grep "turtle fwd 10"
jedierikb
2
Dan inilah mengapa kami merangkul git.
Penebusan Terbatas
mungkin ingin melakukan grep terakhir -i untuk mengabaikan case dan drop -q untuk benar-benar melihat baris yang cocok
Belun
13

Cara terbaik yang saya temukan untuk melakukan ini adalah dengan lebih sedikit:

svn log --verbose | kurang

Setelah lebih sedikit menghasilkan output, Anda dapat menekan /untuk mencari, seperti VIM.

Edit:

Menurut penulis, ia ingin mencari lebih dari sekadar pesan dan nama file. Dalam hal ini Anda akan diminta untuk ghetto-hack bersama dengan sesuatu seperti:

svn diff -r0:HEAD | less

Anda juga dapat mengganti grepatau melakukan pencarian untuk Anda. Jika Anda ingin menggunakan ini pada sub-direktori repositori, Anda harus menggunakannyasvn log untuk melihat revisi pertama di mana direktori itu ada, dan gunakan revisi itu sebagai gantinya 0.

Jack M.
sumber
5
Itu bukan pencarian teks lengkap, itu mencari log dan nama file.
rjmunro
Jika demikian, maka Anda perlu menggunakan log komit yang lebih ekspresif. Jika Anda ingin memahami perbedaan antara revisi, itu adalah seluruh bola lilin. Dan saya pribadi tidak tahu cara untuk melakukan itu.
Jack M.
> svn diff -r0: HEAD> log> less log adalah pilihan saya di windows. Terima kasih
kingoleg
9

Saya telah mencari sesuatu yang serupa. Yang terbaik yang saya hasilkan adalah OpenGrok . Saya belum mencoba mengimplementasikannya, tetapi kedengarannya menjanjikan.

Mike Schall
sumber
Saya telah menggunakan OpenGrok selama beberapa bulan, itu batu.
Mauricio Scheffer
7
svn log -v [repository] > somefile.log

untuk diff Anda dapat menggunakan --diffopsi

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

kemudian gunakan vim atau nano atau apa pun yang Anda suka gunakan, dan lakukan pencarian untuk apa yang Anda cari. Anda akan menemukannya dengan cepat.

Ini bukan skrip mewah atau apa pun yang otomatis. Tapi itu berhasil.

JREN
sumber
AFAICS, Itu akan mencari pesan komit, bukan diffs yang sebenarnya.
rjmunro
Kemudian gunakan svn log -v --diff [repository]> somefile.log
JREN
6

Meskipun tidak gratis, Anda bisa melihat Fisheye dari Atlassian, orang yang sama yang membawakan Anda JIRA. Itu pencarian teks lengkap terhadap SVN dengan banyak fitur berguna lainnya.

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

mrjabba
sumber
1
Fisheye cukup bagus. Seperti yang Anda katakan, tidak gratis, tetapi lisensi committer <= 10 hanya $ 10 / tahun.
Jason S
Saat ini, 5 pengguna adalah $ 10, TETAPI hanya di 10 pengguna itu melompat ke $ 1.000!
Mawg mengatakan mengembalikan Monica
4

Saya hanya mengalami masalah ini dan

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

melakukan pekerjaan untuk saya. Mengembalikan revisi kejadian pertama dan mengutip kalimat yang saya cari.

pfyon
sumber
1
Hanya berfungsi secara lokal dan akan memakan banyak waktu jika repositori besar.
bahrep
2

Saya tidak punya pengalaman dengan itu, tetapi SupoSE (open source, ditulis dalam Java) adalah alat yang dirancang untuk melakukan hal ini.

dF.
sumber
2

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

malam
sumber
1

Saya biasanya melakukan apa yang dikatakan Jack M (gunakan svn log --verbose) tapi saya pipa untuk grep bukannya kurang.

Mark Biek
sumber
5
Itu bukan pencarian teks lengkap, itu mencari log dan nama file.
rjmunro
Itulah yang biasanya saya lakukan, tetapi saya menemukan bahwa dengan lessAnda sebenarnya dapat melihat revisi, tanggal, dll, bukan hanya baris di komentar. Biasanya itu yang saya cari.
Jack M.
1

Saya menulis ini sebagai skrip bash cygwin untuk mengatasi masalah ini.

Namun itu mengharuskan istilah pencarian saat ini dalam file sistem file. Untuk semua file yang cocok dengan grystem filesystem, grep dari semua svn diffs untuk file tersebut kemudian dilakukan. Tidak sempurna, tetapi harus cukup baik untuk sebagian besar penggunaan. Semoga ini membantu.

/ 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 / svnrevisi

#!/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 }'
James McGuigan
sumber
'A' untuk usaha! (gunakan saja git :))
Penebusan Terbatas
-1

Jika Anda mencoba menentukan revisi mana yang bertanggung jawab untuk baris kode tertentu, Anda mungkin mencari:

svn blame

Kredit: jawaban asli

DustWolf
sumber
-3

Saya menemukan skrip bash ini , tetapi saya belum mencobanya.

Douglas Smith
sumber