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:
Przedstawia wiadomość, autora, ścieżkę załączoną do wersji.
Przedstawia szczegółowe zmiany każdej linijki w obiektach.
Pobiera daną wersję pliku i wyświetla jego zawartość na ekranie.
Wyświetla listę plików znajdujących się w katalogu dla podanej wersji.
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.
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
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 $
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 $
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 … $
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.
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 $
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 |
|---|---|
|
Polecenie |
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ź |
|---|---|
|
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 …