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?
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
}
}
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.
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.
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.
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.
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.
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
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.
Odpowiedzi:
Nie ma wbudowanego polecenia, więc zwykle robię coś takiego:
Następnie możesz zadzwonić za pomocą:
źródło
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]
działa dokładnie tak! stackoverflow.com/a/24938573/3185510Trochę różni się od tego, co opisałeś, ale myślę, że może być to, czego naprawdę potrzebujesz:
Wydrukuje plik z każdą linią poprzedzoną czasem i autorem zatwierdzenia, który ostatnio go zmienił.
źródło
Jeśli chcesz zobaczyć całą historię pliku ze zmianami w kodzie:
źródło
--diff
ponieważ ma testy dla opcji, podczas gdy 1.7.3 nie ma żadnych -subversion/tests/cmdline/log_tests.py
.--limit <number>
opcją. Na przykład:svn log --diff --limit 5 [path_to_file]
Możesz użyć
git-svn
do 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.źródło
git log X..Y -o filename
Zacząć od
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
.źródło
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
miły małyRobi 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.
źródło
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.
źródło
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.
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.
źródło
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:
Aby ułatwić wyszukiwanie, możesz zapisać wynik do pliku i użyć polecenia grep pod kątem tego, czego szukasz.
źródło