Przeglądanie historii

Repozytorium Subversion jest jak wehikuł czasu. Zachowuje rekordy każdej zmiany przesłanej do niej, pozwala na przeglądanie historii poprzednich wersji plików i katalogów. Za pomocą jednego polecenia, możesz pobrać (lub przywrócić kopie roboczą) dokładnie tak jak wyglądał projekt w przeszłości, podając datę lub numer wersji. Jednakże, czasami potrzebne jest tylko przeglądnięcie historii zamiast jej przywracanie.

Paręnaście poleceń pozwala na przeglądanie danych historycznych z repozytorium:

svn log

Przedstawia wiadomość, autora, ścieżkę załączoną do wersji.

svn diff

Przedstawia szczegółowe zmiany każdej linijki w obiektach.

svn cat

Pobiera daną wersję pliku i wyświetla jego zawartość na ekranie.

svn list

Wyświetla listę plików znajdujących się w katalogu dla podanej wersji.

Generowanie historii zmian w SVN

Do wyświetlenia historii na temat pliku/katalogu, użyj polecenia svn log. Polecenie to wyświetli dokładnie kto wprowadził zmiany, w jakiej wersji, dokładną datę i wiadomość towarzysząca danej wersji:

$ svn log
------------------------------------------------------------------------
r3 | sally | 2008-05-15 23:09:28 -0500 (Thu, 15 May 2008) | 1 line

Added include lines and corrected # of cheese slices.
------------------------------------------------------------------------
r2 | harry | 2008-05-14 18:43:15 -0500 (Wed, 14 May 2008) | 1 line

Added main() methods.
------------------------------------------------------------------------
r1 | sally | 2008-05-10 19:50:31 -0500 (Sat, 10 May 2008) | 1 line

Initial import
------------------------------------------------------------------------

Pamiętaj, że każdy rekord z loga jest domyślnie wyświetlany od najnowszego do najstarszego wpisu. Jeśli chcesz wyświetlić tylko wpisy z przedziału wersji lub tylko jednej wersji, dodaj opcje --revision (-r):

$ svn log -r 5:19    # wyświetla logi od 5 do 19 wersji w chronologicznym porządku

$ svn log -r 19:5    # wyświetla logi od 5 do 19 wersji w odwróconym porządku

$ svn log -r 8       # wyświetla log dla wersji 8

Oczywiście można wyświetlić logi dla konkretnego pliku lub katalogu. Dla przykładu:

$ svn log foo.c
…
$ svn log http://foo.com/svn/trunk/code/foo.c
…

To wyświetli logi tylko dla wersji w których ten plik został zmieniony.

Jeśli potrzebujesz więcej informacji na temat wprowadzonych zmian w pliku lub katalogu, svn log udostępnia dodatkowo opcje --verbose (-v). Ponieważ Subversion pozwala na przenoszenie, kopiowanie plików i katalogów, ważnym staje się monitorowanie tych zmian. Dlatego podając wspomnianą opcję, svn log doda takie informację do historii:

$ svn log -r 8 -v
------------------------------------------------------------------------
r8 | sally | 2008-05-21 13:19:25 -0500 (Wed, 21 May 2008) | 1 line
Changed paths:
   M /trunk/code/foo.c
   M /trunk/code/bar.h
   A /trunk/code/doc/README

Frozzled the sub-space winch.

------------------------------------------------------------------------

svn log posiada opcję --quiet (-q) która, uszczupla wyświetlane informacje, a w połączeniu z opcją --verbose (-v), wyświetla tylko nazwy plików, które uległy zmianie.

Szczegółowe przeglądanie zmian w repozytorium Subversion

Widzieliśmy już wcześniej wynik działania polecenia svn diff. Polecenie to wyświetla zmiany w formacie diff; użyliśmy go do wyświetlenia lokalnych modyfikacji wprowadzonych w kopii roboczej, zanim zmiany zostały wysłane do repozytorium.

Tak naprawdę, polecenie to ma trzy różne zastosowania::

  • Przeglądanie lokalnych zmian

  • Porównanie lokalnej kopii z repozytorium

  • Porównanie dwóch rożnych wersji w repozytorium

Przeglądanie lokalnych zmian

Jak widzimy, wywołanie svn diff bez podania dodatkowych opcji, porówna pliki w kopii roboczej do ich pierwotnych wersji pobranych z repozytorium:

$ svn diff
Index: rules.txt
===================================================================
--- rules.txt	(revision 3)
+++ rules.txt	(working copy)
@@ -1,4 +1,5 @@
 Be kind to others
 Freedom = Responsibility
 Everything in moderation
-Chew with your mouth open
+Chew with your mouth closed
+Listen when others are speaking
$

Porównanie lokalnej kopii z repozytorium

Podając dokładnie jeden numer wersji wraz z opcją --revision (-r), porównane zostaną pliki znajdujące się w kopii roboczej z plikami znajdującymi się w repozytorium:

$ svn diff -r 3 rules.txt
Index: rules.txt
===================================================================
--- rules.txt	(revision 3)
+++ rules.txt	(working copy)
@@ -1,4 +1,5 @@
 Be kind to others
 Freedom = Responsibility
 Everything in moderation
-Chew with your mouth open
+Chew with your mouth closed
+Listen when others are speaking
$

Porównanie dwóch rożnych wersji w repozytorium

Podając dwa numery wersji, porównane zostaną pliki z dwóch wersji w repozytorium

$ svn diff -r 2:3 rules.txt
Index: rules.txt
===================================================================
--- rules.txt	(revision 2)
+++ rules.txt	(revision 3)
@@ -1,4 +1,4 @@
 Be kind to others
-Freedom = Chocolate Ice Cream
+Freedom = Responsibility
 Everything in moderation
 Chew with your mouth open
$

Bardziej poręczna może okazać się opcja --change (-c) do porównania podanej wersji z wcześniejszą::

$ svn diff -c 3 rules.txt
Index: rules.txt
===================================================================
--- rules.txt	(revision 2)
+++ rules.txt	(revision 3)
@@ -1,4 +1,4 @@
 Be kind to others
-Freedom = Chocolate Ice Cream
+Freedom = Responsibility
 Everything in moderation
 Chew with your mouth open
$

Nawet bez kopii roboczej, można porównać wersję w repozytorium, dodając dokładną ścieżkę do repozytorium:

$ svn diff -c 5 http://svn.example.com/repos/example/trunk/text/rules.txt
…
$

Przeglądanie repozytorium

Używając poleceń svn cat i svn list, można wyświetlić różne wersje plików i katalogów bez pobierania ich na dysk (do kopii roboczej). Można te polecenia wykonywać bez wymogu istnienia kopii roboczej.

svn cat

Jeśli potrzebujesz przeglądnąć jakąś wersję pliku, a niekoniecznie chcesz przeglądnąć różnice pomiędzy dwoma wersjami, użyj polecenia svn cat:

$ svn cat -r 2 rules.txt
Be kind to others
Freedom = Chocolate Ice Cream
Everything in moderation
Chew with your mouth open
$

Możesz oczywiście przekierować wyjście polecenia bezpośrednio do nowego pliku:

$ svn cat -r 2 rules.txt > rules.txt.v2
$

svn list

Polecenie svn list służy do wyświetlenia, jakie pliki znajdują się aktualnie w repozytorium. Bez konieczności pobierania ich na dysk:

$ svn list http://svn.collab.net/repos/svn
README
branches/
clients/
tags/
trunk/

Jeśli potrzebujesz bardziej kompletne informacje, dodaj opcję --verbose (-v) by uzyskać wyjście polecenie jak poniżej:

$ svn list -v http://svn.collab.net/repos/svn
  20620 harry            1084 Jul 13  2006 README
  23339 harry                 Feb 04 01:40 branches/
  21282 sally                 Aug 27 09:41 developer-resources/
  23198 harry                 Jan 23 17:17 tags/
  23351 sally                 Feb 05 13:26 trunk/

Kolumny przedstawiają, numer wersji ostatniej edycji, użytkownik, rozmiar jeśli to plik, datę ostatniej modyfikacji i nazwę obiektu (pliku, folderu).

[Ostrzeżenie] Ostrzeżenie

Polecenie svn list domyślnie korzysta z URL repozytorium dla lokalnej kopii roboczej. Żeby wyświetlić lokalne pliki, użyj polecenia ls (lub inne podobne polecenie).

Pobieranie starszych wersji z repozytorium

Jak w powyższych poleceniach, możesz użyć również opcji --revision (-r) razem z poleceniami svn update i svn checkout, by „zabrać kopie lokalną w przeszłość”: [5]

$ svn checkout -r 1729 # Checkout nowej kopii roboczej z wersji r1729
…
$ svn update -r 1729 # Aktualizuj lokalną kopię roboczą do wersji r1729
…
[Podpowiedź] Podpowiedź

Większość początkujących użytkowników Subversion, próbuje użyć przykładu z svn update do cofania wgranych do repozytorium zmian, ale to nie zadziała. Przy wykonaniu polecenia svn commit wystąpi konflikt, ponieważ w repozytorium będą znajdować się nowsze wersje plików. Zobacz „Resurrecting Deleted Items” żeby zobaczyć jak cofnąć wysłane zmiany.

Na koniec, jeśli tworzysz paczkę plików z repozytorium Subversion, ale nie chcesz by foldery .svn były dodane, użyj polecenia svn export. Polecenie to utworzy lokalnie kopie danej wersji z repozytorium, bez zbędnych folderów .svn. Podobnie jak w przypadku svn update i svn checkout, możesz dodać opcję --revision (-r) do polecenia svn export:

$ svn export http://svn.example.com/svn/repos1 # Exports latest revision
…
$ svn export http://svn.example.com/svn/repos1 -r 1729
# Exports revision r1729
…


[5] Widzisz? Mówiliśmy, że Subversion jest jak wehikuł czasu.