SVN'deki bir dosyadaki tüm geçmiş değişiklikleri nasıl görüntüleyebilirim


169

svn diff -r a:b repo Belirtilen iki düzeltme arasındaki değişiklikleri görebileceğimi biliyorum . Ne istiyorum dosyayı değiştiren her revizyon için bir farktır. Böyle bir komut var mı?


16
Garip bir şekilde adlandırılan "suçlama" komutunda gizlidir.
goosemanjack

6
Denemeden önce @ goosemanjack'in şaka yaptığını düşündüm.
SSH Bu

Yanıtlar:


181

Bunun için yerleşik bir komut yoktur, bu yüzden genellikle sadece böyle bir şey yaparım:

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

Ardından, aşağıdakilerle arayabilirsiniz:

history_of_file $1

35
Daha önce hiç "hazır blok içine boru" hile görmedim. Temiz.


Bunu .bashrc dosyama ekledim. Başladığımda svn: '.' is not a working copy svn: Syntax error in revision argument '@HEAD' svn: Syntax error in revision argument '@HEAD'
Francisc0

1
@ Francisco0: son satırı bashrc'nize eklemeyin. işlev tanımının bir parçası değildir, işleve bir çağrıdır çünkü verilen örnek bağımsız bir komut dosyası olarak kullanılmak üzere tasarlanmıştır.
bendin

26
svn log --diff [path_to_file]tam olarak böyle çalışır! stackoverflow.com/a/24938573/3185510
webster

143

Açıkladığınızdan biraz farklı, ama aslında ihtiyacınız olan şey bu olabilir:

svn blame filename

Dosyayı, en son değiştiren taahhüdün zamanı ve yazarı tarafından önceden eklenmiş her satırla yazdırır.


4
Vay bu harika! SVN'yi yıllardır kullanıyor ve bunu hiç bilmiyordum: O
Evet Barry

4
Zaman damgasını görmek için ayrıntılı / -v seçeneğine ihtiyacınız olabilir (svn 1.7.9 varsayılan derlememle yapıyorum).
Weston C

profesör svn için ilk suçlama eklentisini yazdı. Buna hala bakmam gerekiyordu. Bu görevde tamamen kendi kendine bir dolgu yapıyor. : P
Joseph Dailey

93

Kod değişiklikleri içeren bir dosyanın tüm geçmişini görmek istiyorsanız:

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

3
--Diff seçeneğinin ne zaman eklendiğini bilmiyorum ama svn 1.8.10 ile çalışıyor, bu yüzden bash betiğine gerek yok
Guillaume Gros

1
Bence, svn 1.7.4 bu seçeneği tanıttı çünkü seçenek --diffiçin testlere sahipken 1.7.3'te hiçbiri yok subversion/tests/cmdline/log_tests.py.
geçerli

Sadece küçük bir not: geçmişin uzunluğuna bağlı olarak, log.txt dosyasının tamamen oluşturulmasından önce biraz zaman alabilir (hemen okunabilir olsa da).
Ivan Durst

1
Biri bunu en son X revizyonlarıyla nasıl sınırlar?
Enigma

@ Enigma: --limit <number>seçeneği ile. Gibi:svn log --diff --limit 5 [path_to_file]
Reid

37

Sen kullanabilirsiniz git-svnsonra, bir Git depo içine depo içe kullanmak git log -p filename. Bu, dosya için her günlük girişini ve ardından karşılık gelen farkı gösterir.


27
Git'i kur, git deposu oluştur, git komutunu mu kullanıyorsun? Soru etiketlendi ve Subversion hakkında sordu.
Ken Gentle

21
Git'i git-svn ile Subversion istemcisi olarak kullanıyorum. Ben bir Subversion deposuna karşı log + diff işlemi böyle yaparım. Git'in depo görüntüleme için gerçekten mükemmel bazı araçları var, bu çok tuhaf bir fikir değil.
Greg Hewgill

10
SVN'de olmayan işlevsellik sağlamak için birinin üstünde (haklı olarak) güzel bir senaryo yazdığı için tebrik edilmiştir. Siz gitmedikçe git'in yerel olduğunu görmek, bu takımları çağırabilirsiniz, işler hakkında üzülmenize gerek yok.
Adam Tolley

Ayrıca, dosyanın geçmişini görüntülemek için bir GUI (tercih edilen) kullanmanıza izin veren tek yanıttır. Diğer cevaplar da git X'te kolay olan son X revizyonlarının nasıl sınırlandırılacağını (hiç mümkün değil?) Açıklamamıştır. git log X..Y -o filename
TamaMcGlinn

21

İle başla

svn log -q file | grep '^r' | cut -f1 -d' '

Bu, dosyanın değiştirildiği revizyonların bir listesini alır ve daha sonra tekrarlanan çağrıları kodlamak için kullanabilirsiniz svn diff.


4
ya da ... devam et! 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.txtgüzel küçük bir liner (awk kesim ile aynı)
Kasapo

8

Garip bir şekilde adlandırılan "suçlama" komutu bunu yapar. Kaplumbağa kullanırsanız, size bir "revizyondan" iletişim kutusu, ardından Revizyon numarası ve yanında yazarın satır satır göstergesini içeren bir dosya listesi verir.

Düzeltme bilgilerine sağ tıklarsanız, check-in işleminin bir parçası olan diğer dosyalarla birlikte tam check-in bilgisi veren bir "Günlüğü göster" iletişim kutusu açabilirsiniz.


1
Bu çok kullanışlı, ama OP'nin aradığı şey değil, sadece dosyanın tam bir tarihi, sadece mevcut dosyanın tarihsel katkıları değil. Bu tam geçmiş, belirli kodların neden kaldırıldığını veya değiştirildiğini ve ne zaman değiştirildiğini anlamak için yararlıdır.
Adam Tolley

Aksine, isim oldukça doğrudur. Belirli bir (boktan / buggy / anlaşılmaz) kod yığını için kimi suçlayacağınızı söyler.
ivan_pozdeev

Komutun açık isminin "suçlama" yerine "kredi" olması iyi olmaz mıydı? :)
Nick

1
@Nick svn övgü kişinin nasıl hissettiğine bağlı olarak svn suçlama için bir takma addır.
stefgosselin

@stefgosselin - Bu not için teşekkürler. Bir seçenek olduğunu bildiğime sevindim! :)
Nick

3

Bildiğim kadarıyla bunu gerçekleştirmek için yerleşik bir svn komutu yoktur. Tüm farkları oluşturmak için birkaç komut çalıştırmak için bir komut dosyası yazmanız gerekir. Daha basit bir yaklaşım, bu seçenek bir GUI svn istemcisi kullanmak olacaktır. Eclipse için yıkıcı eklenti gibi birçoğu bir dosyanın geçmişini listeler ve her revizyonun farkını görüntülemenize izin verir.


3

Teşekkürler Bendin. Çözümünü çok beğendim.

İlk olarak en son değişiklikleri göstererek ters sırada çalışacak şekilde değiştirdim. Uzun yıllar süren kod ile önemli olan, birkaç yıl boyunca korunur. Ben genellikle daha fazla içine boru.

svnhistory elements.py |more

Sıralamaya -r ekledim. Teknik özellikleri kaldırdım. 'ilk kayıt' işleme. Fark edecek bir şey olmadığı için son girişte hata yapacak. Bununla birlikte yaşıyor olmama rağmen hiçbir zaman o kadar aşağı inemem.

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

Bu konuyu araştırırken bir sürü kısmi cevap gördüm. Bu benim için işe yaradı ve umarım başkalarına yardımcı olur. Bu komut, çıktıyı komut satırında, revizyon numarasını, yazarı, revizyon zaman damgasını ve yapılan değişiklikleri gösterir:

svn blame -v <filename>

Aramanızı kolaylaştırmak için çıktıyı bir dosyaya yazabilir ve aradığınızı grep edebilirsiniz.

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.