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?


16
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
    }
}

Kemudian, Anda dapat menyebutnya dengan:

history_of_file $1

35
Saya belum pernah melihat trik "piping into the braced block" sebelumnya. Rapi.

5
Versi file skrip ini, fwiw.
ladenedge

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.
bendin

26
svn log --diff [path_to_file]bekerja persis seperti ini! stackoverflow.com/a/24938573/3185510
webster

143

Sedikit berbeda dari yang Anda gambarkan, tetapi saya pikir ini mungkin yang sebenarnya Anda butuhkan:

svn blame filename

Ini akan mencetak file dengan setiap baris diawali oleh waktu dan penulis dari komit yang terakhir mengubahnya.


4
Wah ini luar biasa! Sudah menggunakan SVN selama bertahun-tahun dan tidak pernah tahu tentang ini: O
Ya Barry

4
Anda mungkin memerlukan opsi verbose / -v untuk melihat stempel waktu (saya lakukan dengan build default svn 1.7.9).
Weston C

profesor saya menulis plugin menyalahkan awal untuk svn. Saya masih harus mencari ini. Dia benar-benar mengisi sendiri tugas ini. : P
Joseph Dailey

93

Jika Anda ingin melihat seluruh riwayat file dengan perubahan kode:

svn log --diff [path_to_file] > log.txt

3
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.


27
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.


4
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.


1
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.


3

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

0

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.