Bagaimana saya bisa melihat semua perubahan historis ke file di SVN
169
Saya tahu saya bisa svn diff -r a:b repo melihat perubahan antara dua revisi yang ditentukan. Yang saya suka adalah perbedaan untuk setiap revisi yang mengubah file. Apakah perintah seperti itu tersedia?
Tersembunyi di perintah "menyalahkan" yang anehnya bernama.
goosemanjack
6
Saya pikir @goosemanjack bercanda, sampai saya mencobanya.
SSH
Jawaban:
181
Tidak ada perintah bawaan untuk itu, jadi saya biasanya hanya melakukan sesuatu seperti ini:
#!/bin/bash
# history_of_file
#
# Outputs the full history of a given file as a sequence of
# logentry/diff pairs. The first revision of the file is emitted as
# full text since there's not previous version to compare it to.
function history_of_file() {
url=$1 # current url of file
svn log -q $url | grep -E -e "^r[[:digit:]]+" -o | cut -c2- | sort -n | {
# first revision as full text
echo
read r
svn log -r$r $url@HEAD
svn cat -r$r $url@HEAD
echo
# remaining revisions as differences to previous revision
while read r
do
echo
svn log -r$r $url@HEAD
svn diff -c$r $url@HEAD
echo
done
}
}
Saya menambahkan ini ke file .bashrc saya. Ketika saya memulai, saya mengerti svn: '.' is not a working copy svn: Syntax error in revision argument '@HEAD' svn: Syntax error in revision argument '@HEAD'
Francisc0
1
@ Francisco0: jangan sertakan baris terakhir di bashrc Anda. itu bukan bagian dari definisi fungsi, ini adalah panggilan ke fungsi karena contoh yang diberikan dimaksudkan untuk digunakan sebagai skrip yang berdiri sendiri.
Saya tidak tahu kapan opsi --diff telah ditambahkan tetapi berfungsi dengan svn 1.8.10, jadi tidak perlu skrip bash
Guillaume Gros
1
Saya pikir, svn 1.7.4 memperkenalkan opsi --diffkarena ia memiliki tes untuk opsi sedangkan 1.7.3 tidak memilikinya - subversion/tests/cmdline/log_tests.py.
berlaku
Hanya sebuah catatan kecil: tergantung pada panjangnya sejarah, ini bisa memakan waktu cukup lama sebelum file log.txt benar-benar dirender (meskipun akan segera dapat dibaca).
Ivan Durst
1
Bagaimana seseorang membatasi ini pada revisi X terbaru?
Enigma
@ Enigma: dengan --limit <number>opsi. Seperti itu:svn log --diff --limit 5 [path_to_file]
Reid
37
Anda bisa menggunakan git-svnuntuk mengimpor repositori ke repositori Git, lalu gunakan git log -p filename. Ini menunjukkan setiap entri log untuk file diikuti oleh diff yang sesuai.
Instal git, buat repositori git, gunakan perintah git? Pertanyaan itu ditandai dan ditanyakan tentang Subversion.
Ken Gentle
21
Saya menggunakan git sebagai klien Subversion dengan git-svn. Ini adalah bagaimana saya akan melakukan operasi log + diff terhadap repositori Subversion. Git memiliki beberapa alat yang sangat bagus untuk melihat repositori, itu bukan ide yang aneh.
Greg Hewgill
10
Seseorang di atas (benar) diberi selamat atas penulisan skrip yang bagus - untuk menyediakan fungsionalitas yang tidak ada di SVN. Melihat bahwa git bersifat lokal kecuali Anda menekan, Anda dapat memanggil alat ini, tidak perlu merasa kesal tentang segala hal.
Adam Tolley
Ini juga satu-satunya jawaban yang memungkinkan Anda menggunakan GUI (pilihan) untuk melihat riwayat file. Jawaban lain juga belum menjelaskan bagaimana membatasi revisi X terakhir (mungkin sama sekali?), Yang mudah di git. git log X..Y -o filename
TamaMcGlinn
21
Dimulai dari
svn log -q file | grep '^r' | cut -f1 -d' '
Itu akan membuat Anda daftar revisi di mana file berubah, yang kemudian dapat Anda gunakan untuk skrip panggilan berulang svn diff.
atau ... teruskan! svn log -q some_file.xxx | grep ^r | awk '{print $1}' | sed -e 's/^r//' | xargs -i svn diff -rHEAD:{} some_file.xxx > ~/file_history.txtone-liner kecil yang bagus (awk tidak sama dengan cut)
Kasapo
8
Perintah "menyalahkan" bernama aneh melakukan ini. Jika Anda menggunakan Kura-kura, itu memberi Anda dialog "dari revisi", kemudian daftar file dengan indikator baris per baris dari angka Revisi dan penulis di sebelahnya.
Jika Anda mengklik kanan pada info revisi, Anda dapat memunculkan dialog "Tampilkan log" yang memberikan informasi checkin lengkap, bersama dengan file lain yang merupakan bagian dari checkin.
Itu sangat berguna, tetapi bukan yang dicari OP, yang merupakan riwayat lengkap file, bukan hanya kontribusi historis dari file saat ini. Riwayat lengkap itu berguna saat melihat ke belakang untuk mencari tahu mengapa kode tertentu dihapus atau diubah, dan kapan.
Adam Tolley
Sebaliknya, namanya cukup tepat. Ini memberitahu Anda siapa yang harus disalahkan untuk sepotong kode tertentu (jelek / kereta / tidak dapat dipahami).
ivan_pozdeev
Bukankah lebih baik jika nama yang jelas untuk perintah itu adalah "penghargaan" daripada "kesalahan"? :)
Nick
1
@Nick svn pujian adalah alias untuk menyalahkan svn, tergantung pada bagaimana perasaan seseorang.
stefgosselin
@stefgosselin - Terima kasih atas catatan itu. Saya senang mengetahui ada pilihan! :)
Nick
3
Sejauh yang saya tahu tidak ada perintah svn dibangun untuk mencapai ini. Anda perlu menulis skrip untuk menjalankan beberapa perintah untuk membangun semua diff. Pendekatan yang lebih sederhana adalah menggunakan klien svn GUI jika itu merupakan opsi. Banyak dari mereka seperti plugin subversif untuk Eclipse akan mencantumkan riwayat file serta memungkinkan Anda untuk melihat perbedaan dari setiap revisi.
Terima kasih, Bendin. Saya sangat menyukai solusi Anda.
Saya mengubahnya untuk bekerja dalam urutan terbalik, menunjukkan perubahan terbaru terlebih dahulu. Yang penting dengan kode lama, dipertahankan selama beberapa tahun. Saya biasanya menyalurkannya ke lebih banyak.
svnhistory elements.py |more
Saya menambahkan -r ke semacam itu. Saya menghapus spec. menangani 'catatan pertama'. Itu akan kesalahan pada entri terakhir, karena tidak ada yang berbeda dengannya. Meskipun saya hidup dengan itu karena saya tidak pernah turun sejauh itu.
#!/bin/bash
# history_of_file
#
# Bendin on Stack Overflow: http://stackoverflow.com/questions/282802
# Outputs the full history of a given file as a sequence of
# logentry/diff pairs. The first revision of the file is emitted as
# full text since there's not previous version to compare it to.
#
# Dlink
# Made to work in reverse order
function history_of_file() {
url=$1 # current url of file
svn log -q $url | grep -E -e "^r[[:digit:]]+" -o | cut -c2- | sort -nr | {
while read r
do
echo
svn log -r$r $url@HEAD
svn diff -c$r $url@HEAD
echo
done
}
}
history_of_file $1
Saya telah melihat banyak jawaban parsial saat meneliti topik ini. Inilah yang bekerja untuk saya dan berharap itu membantu orang lain. Perintah ini akan menampilkan output pada baris perintah, menampilkan nomor revisi, penulis, stempel waktu revisi dan perubahan yang dilakukan:
svn blame -v <filename>
Untuk membuat pencarian Anda lebih mudah, Anda dapat menulis output ke file dan menerima apa yang Anda cari.
Jawaban:
Tidak ada perintah bawaan untuk itu, jadi saya biasanya hanya melakukan sesuatu seperti ini:
Kemudian, Anda dapat menyebutnya dengan:
sumber
svn: '.' is not a working copy svn: Syntax error in revision argument '@HEAD' svn: Syntax error in revision argument '@HEAD'
svn log --diff [path_to_file]
bekerja persis seperti ini! stackoverflow.com/a/24938573/3185510Sedikit berbeda dari yang Anda gambarkan, tetapi saya pikir ini mungkin yang sebenarnya Anda butuhkan:
Ini akan mencetak file dengan setiap baris diawali oleh waktu dan penulis dari komit yang terakhir mengubahnya.
sumber
Jika Anda ingin melihat seluruh riwayat file dengan perubahan kode:
sumber
--diff
karena ia memiliki tes untuk opsi sedangkan 1.7.3 tidak memilikinya -subversion/tests/cmdline/log_tests.py
.--limit <number>
opsi. Seperti itu:svn log --diff --limit 5 [path_to_file]
Anda bisa menggunakan
git-svn
untuk mengimpor repositori ke repositori Git, lalu gunakangit log -p filename
. Ini menunjukkan setiap entri log untuk file diikuti oleh diff yang sesuai.sumber
git log X..Y -o filename
Dimulai dari
Itu akan membuat Anda daftar revisi di mana file berubah, yang kemudian dapat Anda gunakan untuk skrip panggilan berulang
svn diff
.sumber
svn log -q some_file.xxx | grep ^r | awk '{print $1}' | sed -e 's/^r//' | xargs -i svn diff -rHEAD:{} some_file.xxx > ~/file_history.txt
one-liner kecil yang bagus (awk tidak sama dengan cut)Perintah "menyalahkan" bernama aneh melakukan ini. Jika Anda menggunakan Kura-kura, itu memberi Anda dialog "dari revisi", kemudian daftar file dengan indikator baris per baris dari angka Revisi dan penulis di sebelahnya.
Jika Anda mengklik kanan pada info revisi, Anda dapat memunculkan dialog "Tampilkan log" yang memberikan informasi checkin lengkap, bersama dengan file lain yang merupakan bagian dari checkin.
sumber
Sejauh yang saya tahu tidak ada perintah svn dibangun untuk mencapai ini. Anda perlu menulis skrip untuk menjalankan beberapa perintah untuk membangun semua diff. Pendekatan yang lebih sederhana adalah menggunakan klien svn GUI jika itu merupakan opsi. Banyak dari mereka seperti plugin subversif untuk Eclipse akan mencantumkan riwayat file serta memungkinkan Anda untuk melihat perbedaan dari setiap revisi.
sumber
Terima kasih, Bendin. Saya sangat menyukai solusi Anda.
Saya mengubahnya untuk bekerja dalam urutan terbalik, menunjukkan perubahan terbaru terlebih dahulu. Yang penting dengan kode lama, dipertahankan selama beberapa tahun. Saya biasanya menyalurkannya ke lebih banyak.
Saya menambahkan -r ke semacam itu. Saya menghapus spec. menangani 'catatan pertama'. Itu akan kesalahan pada entri terakhir, karena tidak ada yang berbeda dengannya. Meskipun saya hidup dengan itu karena saya tidak pernah turun sejauh itu.
sumber
Saya telah melihat banyak jawaban parsial saat meneliti topik ini. Inilah yang bekerja untuk saya dan berharap itu membantu orang lain. Perintah ini akan menampilkan output pada baris perintah, menampilkan nomor revisi, penulis, stempel waktu revisi dan perubahan yang dilakukan:
Untuk membuat pencarian Anda lebih mudah, Anda dapat menulis output ke file dan menerima apa yang Anda cari.
sumber