Jak mogę wyświetlić wszystkie historyczne zmiany w pliku w SVN


169

Wiem, że mogę svn diff -r a:b repo zobaczyć zmiany między dwiema określonymi wersjami. To, co chciałbym, to różnica dla każdej wersji, która zmieniła plik. Czy takie polecenie jest dostępne?


16
Jest ukryty w dziwnie nazwanym poleceniu „winy”.
goosemanjack

6
Myślałem, że @goosemanjack żartuje, dopóki tego nie wypróbowałem.
SSH To

Odpowiedzi:


181

Nie ma wbudowanego polecenia, więc zwykle robię coś takiego:

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

Następnie możesz zadzwonić za pomocą:

history_of_file $1

35
Nigdy wcześniej nie widziałem tej sztuczki polegającej na „wpuszczaniu rur do bloku stężonego”. Schludny.

5
Wersja pliku wsadowego tego skryptu, fwiw.
ladenedge

Dodałem to do mojego pliku .bashrc. Kiedy startuję, dostaję svn: '.' is not a working copy svn: Syntax error in revision argument '@HEAD' svn: Syntax error in revision argument '@HEAD'
Francisc0

1
@ Francisco0: nie umieszczaj ostatniej linii w swoim bashrc. nie jest częścią definicji funkcji, jest to wywołanie funkcji, ponieważ podany przykład jest przeznaczony do użytku jako samodzielny skrypt.
bendin

26
svn log --diff [path_to_file]działa dokładnie tak! stackoverflow.com/a/24938573/3185510
webster

143

Trochę różni się od tego, co opisałeś, ale myślę, że może być to, czego naprawdę potrzebujesz:

svn blame filename

Wydrukuje plik z każdą linią poprzedzoną czasem i autorem zatwierdzenia, który ostatnio go zmienił.


4
Whoa, to jest niesamowite! Używam SVN od lat i nigdy o tym nie wiedziałem: O
Tak Barry

4
Możesz potrzebować opcji verbose / -v, aby zobaczyć znacznik czasu (robię to z moją domyślną kompilacją svn 1.7.9).
Weston C

mój profesor napisał początkową wtyczkę winy do svn. Musiałem to jeszcze sprawdzić. Całkowicie wykonuje to zadanie samodzielnie. : P
Joseph Dailey

93

Jeśli chcesz zobaczyć całą historię pliku ze zmianami w kodzie:

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

3
Nie wiem, kiedy dodano opcję --diff, ale działa z svn 1.8.10, więc nie ma potrzeby stosowania skryptu bash
Guillaume Gros

1
Myślę, że svn 1.7.4 wprowadził opcję, --diffponieważ ma testy dla opcji, podczas gdy 1.7.3 nie ma żadnych - subversion/tests/cmdline/log_tests.py.
ważny

Mała uwaga: w zależności od długości historii może to zająć trochę czasu, zanim plik log.txt zostanie całkowicie wyrenderowany (chociaż będzie można go odczytać od razu).
Ivan Durst,

1
Jak można to ograniczyć do najnowszych wersji X?
Enigma

@Enigma: z --limit <number>opcją. Na przykład:svn log --diff --limit 5 [path_to_file]
Reid

37

Możesz użyć git-svndo zaimportowania repozytorium do repozytorium Git, a następnie użyć git log -p filename. To pokazuje każdy wpis dziennika dla pliku, po którym następuje odpowiedni plik różnicowy.


27
Zainstalować git, utworzyć repozytorium git, użyć polecenia git? Pytanie zostało oznaczone i zapytane o Subversion.
Ken Gentle,

21
Używam git jako klienta Subversion z git-svn. W ten sposób wykonałbym operację log + diff na repozytorium Subversion. Git ma naprawdę doskonałe narzędzia do przeglądania repozytoriów, to nie jest taki dziwaczny pomysł.
Greg Hewgill,

10
Powyżej komuś gratuluję (słusznie) napisania ładnego skryptu - zapewnienia funkcjonalności nieobecnej w SVN. Widząc, że git jest lokalny, chyba że naciskasz, możesz nazwać to narzędzie, nie musisz się denerwować.
Adam Tolley

Jest to również jedyna odpowiedź, która umożliwia użycie GUI (z wyboru) do przeglądania historii pliku. Inne odpowiedzi również nie wyjaśniły, jak ograniczyć się do ostatnich X wersji (w ogóle możliwe?), Co jest łatwe w git. git log X..Y -o filename
TamaMcGlinn

21

Zacząć od

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

Spowoduje to wyświetlenie listy wersji, w których plik się zmienił, której możesz następnie użyć do skryptu powtarzających się wywołań svn diff.


4
lub ... kontynuuj! 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.txtmiły mały
jednoliniowiec

8

Robi to dziwnie nazwane polecenie „blame”. Jeśli używasz Tortoise, pojawi się okno dialogowe „od wersji”, a następnie lista plików ze wskaźnikiem wiersz po wierszu numeru wersji i autora obok niego.

Jeśli klikniesz prawym przyciskiem myszy informacje o wersji, możesz wyświetlić okno dialogowe „Pokaż dziennik”, które zawiera pełne informacje o meldowaniu się wraz z innymi plikami, które były częścią tego wpisu.


1
To bardzo przydatne, ale nie to, czego szukał PO, czyli pełna historia pliku, a nie tylko historyczny wkład bieżącego pliku. Ta pełna historia jest przydatna, gdy spojrzymy wstecz, aby dowiedzieć się, dlaczego dany kod został usunięty lub zmieniony i kiedy.
Adam Tolley

Wręcz przeciwnie, nazwa jest całkiem poprawna. Mówi ci, kogo winić za konkretny (kiepski / błędny / niezrozumiały) fragment kodu.
ivan_pozdeev

Czy nie byłoby dobrze, gdyby oczywistą nazwą polecenia było „kredyt”, a nie „wina”? :)
Nick

1
Pochwała @Nick svn jest aliasem do winy svn, w zależności od tego, jak się czujesz.
stefgosselin

@stefgosselin - Dzięki za tę notatkę. Cieszę się, że jest wybór! :)
Nick

3

O ile wiem, nie ma wbudowanego polecenia svn, aby to osiągnąć. Będziesz musiał napisać skrypt, aby uruchomić kilka poleceń, aby zbudować wszystkie różnice. Prostszym podejściem byłoby użycie klienta svn GUI, jeśli jest taka opcja. Wiele z nich, takich jak subwersywna wtyczka do Eclipse, zawiera listę historii pliku, a także umożliwia przeglądanie różnic każdej wersji.


3

Dzięki, Bendin. Twoje rozwiązanie bardzo mi się podoba.

Zmieniłem to tak, aby działało w odwrotnej kolejności, pokazując najpierw najnowsze zmiany. Co jest ważne w przypadku długiego kodu, utrzymywanego przez kilka lat. Zwykle łączę to w więcej.

svnhistory elements.py |more

Dodałem -r do sortowania. Usunąłem specyfikację. obsługa „pierwszego rekordu”. Jest to błąd przy ostatnim wpisie, ponieważ nie ma z czym go porównywać. Chociaż żyję z tym, ponieważ nigdy nie schodzę tak daleko.

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

Podczas badania tego tematu widziałem kilka częściowych odpowiedzi. To właśnie zadziałało dla mnie i mam nadzieję, że pomoże innym. To polecenie wyświetli dane wyjściowe w wierszu poleceń, pokazując numer wersji, autora, sygnaturę czasową wersji i wprowadzone zmiany:

svn blame -v <filename>

Aby ułatwić wyszukiwanie, możesz zapisać wynik do pliku i użyć polecenia grep pod kątem tego, czego szukasz.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.