Podstawy SVN, poradnik dla początkujących
Wstęp do SVN dla użytkowników początkujących. Opis poleceń i zasad działania systemu SVN, tagowanie, branchowanie, merge’owanie, czyli jak zacząć swoją przygodę z systemem kontroli wersji.
Spis treści
Do czego służy SVN?
SVN (alias Subversion) to System Kontroli Wersji, będący oprogramowaniem wolnym (na licencji Apache). Jest zastępcą systemu CVS, który jeszcze całkiem niedawno był zdecydowanie bardziej popularny. SVN służy do wersjonowania plików, najczęściej źródłowych wersji programów. Dobrze sprawdza się przy równoczesnej pracy wielu użytkowników, pracujących nad wspólnym kodem źródłowym.
Do czego nie nadaje się SVN
Nie nadaje się do wersjonowania plików, dla których nie potrafi sensownie zrobić wersji różnicowej, czyli przede wszystkim dla plików binarnych, graficznych, czy filmów. Nie znaczy to, że takich plików nie da się w repozytorium trzymać, niemniej jednak nie będzie możliwe dobre zarządzanie nimi, czy merge’owanie. Faktem jest, że posiada znacznie lepszą obsługę tych plików niż np. CVS, ale nie do tego służy.
Plik będący dokumentem w formacie DOC, DOCX czy ODT nie jest plikiem tekstowym, więc jeśli chcesz ze znajomymi/współpracownikami zająć się wspólną edycją dokumentów (np. pisanie pracy magisterskiej w kilka osób), może warto zainteresować się LaTeX-em.
Kilka cech Subversion
Posiada własny protokół, aczkolwiek może korzystać z HTTP. Można ściągnąć wersję serwera odpalaną na własnym komputerze na Windowsie i testować, jeśli nie posiadasz dostępu do żadnego serwera SVN.
Rozmiar danych zajmowanych dla kolejnych wersji pliku na serwerze SVN zależy od różnicy pomiędzy tymi wersjami. Tak jak wspomniałem, pliki binarne czy graficzne nie są tak dobrze obsługiwane, chociaż jest zaimplementowany algorytm wyliczający różnicówki plików binarnych.
Repozytorium może być obsługiwane w bazie danych, albo w lokalnym systemie plików. W wersji pod Windowsa nie potrzebujesz żadnych dodatkowych programów ani baz danych, aby uzupełnić w pełni działający serwer SVN.
SVN posiada globalny system numerowania rewizji. Numer rewizji oznacza w zasadzie kolejny numer każdego wykonanego commita.
Początki i podstawowe polecenia
Zanim zaczniesz korzystać
Adresy zasobów w repozytorium
Do repozytorium można się dostać przez różne protokoły, a zatem do każdego pliku/katalogu istnieć może kilka adresów.
- file:// – bezpośredni dostęp po lokalnym systemie plików
- http:// – przez protokół WebDAV
- https:// – jak wyżej, tylko z szyfrowaniem SSL
- svn:// – własny protokół Subversion (domyślnie port 3690)
- svn+ssh:// – jak wyżej, przez tunel SSH
Lokalne kopie robocze
Aby pracować (czyli dokonywać zmian) w pliku będącym w repozytorium SVN, musisz stworzyć jego kopię roboczą (ang. working copy). Dopóki pracujesz na kopii roboczej, czyli plikach lokalnych na swoim komputerze, inni nie widzą zmian które wprowadziłeś (faktem jest, że można pracować na serwerze zdalnym i dalej jest to kopia robocza, ale najczęściej jest to na komputerze lokalnym, więc nie ma się co rozwodzić nad pojęciem „lokalności”). Aby inni mogli zobaczyć Twoje zmiany, musisz zakomitować je do repozytorium, czyli „wprowadzić” na serwer.
Każda kopia robocza jest kopią konkretnej rewizji danego drzewa repozytorium. Jeśli więc wykonujesz commit zmian własnych a w repozytorium jest nowsza wersja plików które chcesz zapisać (czyli pliki mają wyższe rewizje niż Twoja lokalna), musisz dokonać scalania (ang. merge) zmian. Ale o tym później.
Konfiguracja środowiska do pracy z SVN
Jeśli korzystasz z SVN pod Linuksem (nie ma znaczenia czy to stacja robocza czy sesja na zdalnym serwerze), pamiętaj aby poprawnie skonfigurować konsolę i zmienną środowiskową VISUAL. Wszystkie commity do SVNa dokonywane bez uwzględnienia parametru z komentarzem commita, będą wymagały wpisania ich w edytorze ustawionym właśnie w środowisku.
Podstawowe polecenia
W poniższej tabelce zebrane są podstawowe polecenia. Podstawowa wiedza na temat działania SVN wcześniej czy później Ci się przyda, nawet jeśli co dzień korzystasz z nakładki okienkowej (np. TortoiseSVN).
Komenda | Przykład | Opis |
---|---|---|
svn add <ścieżka> | svn add plik.txt | Dodaje plik/katalog podany w ścieżce do repozytorium w bieżącej ścieżce kopii roboczej |
svn blame <plik>[@wersja] | svn blame plik.txt | Wypisuje zawartość pliku, dodając w każdym wierszu informacje o osobie odpowiedzialnej za ten wiersz i rewizji, w której ten wiersz był dodany lub modyfikowany |
svn cat <plik>[@wersja] | svn cat svn://server:port/ścieżka/plik.txt | Wypisuje zawartość danego pliku |
svn checkout <URL>[@wersja] <ścieżka lokalna> | svn checkout svn://server:port/ścieżka/ katalog-lokalny | Pobiera do lokalnej ścieżki gałąź drzewa repozytorium |
svn co… | Skrót od checkout | |
svn commit [ścieżka] | svn commit plik1.txt plik2.txt katalog/plik3.txt | Zatwierdza lokalne zmiany, zapisując je w repozytorium. Jeśli nie podamy ścieżki, odnosi się do katalogu bieżącego |
svn ci… | Skrót do commit | |
svn copy <źródło> <cel> | svn copy svn://server:port/ścieżka/trunk svn://server:port/ścieżka/tags/rel_1.0 | Kopiuje źródło do celu. Źródło i cel mogą być katalogami kopii roboczej lub bezwzględnymi URLami repozytorium; służy np. do wystawiania tagów i branche’y |
svn cp… | Skrót do copy | |
svn delete <ścieżka lub URL> | svn delete plik5-tymczasowy.txt |
Usuwa plik/katalog z podanej ścieżki kopii roboczej lub URLa repozytorium |
svn del/remove/rm… |
Skróty/aliasy do delete |
|
svn diff… <URL1> <URL2> | svn diff svn://server:port/ścieżka/tags/rel_1.0/plik.txt svn://server:port/ścieżka/tags/rel_1.1.plik.txt |
Pokazuje różnice pomiędzy dwoma rewizjami danego pliku lub ścieżkami. Posiada dużo opcji, warto zobaczyć helpa |
svn help [polecenie SVN] | svn help diff |
Wyświetla pomoc dotyczącą SVN w ogólności lub konkretnej komendy |
svn import [ścieżka] <URL> | svn import /katalog/podkatalog svn://server:port/ścieżka/trunk | Importuje lokalny katalog do podanego URLa repozytorium |
svn info [<cel>[@wersja]] | svn info | Wypisuje informacje o podanym obiekcie (np. o bieżącej kopii roboczej) |
svn list [cel] | svn list svn://server:port/ścieżka/trunk | Listuje zawartość repozytorium dla katalogu podanego jako cel |
svn ls… | Skrót do list | |
svn log <cel> | svn log svn://server:port/ścieżka/trunk | Listuje komentarze kolejnych komitów danego pliku/katalogu |
svn merge <źródło1> <źródło2> | svn merge svn://server:port/ścieżka/trunk svn://server:port/ścieżka/branch/dev_1.0 | Scala (merge’uje) dwie gałęzie repozytorium. Opisane szczegółowo w punkcie dotyczącym merge’owania |
svn move <źródło> <cel> | svn move plik.txt plik-nowanazwa.txt | Przenosi lub zmienia nazwę zasobu w repozytorium |
svn mv/rename/ren… | Skróty/aliasy do move | |
svn propdel/propedit/propget/proplist/propset <ścieżka> | svn propedit svn:externals katalog | Listowanie, pobieranie i modyfikacje atrybutu (ang. property) pliku lub katalogu. Opisane dokładniej w punkcie dotyczącym atrybutów (ang. properties) |
svn resolve… | svn resolve plik.txt | Rozwiązuje konflikty w plikach i katalogach |
svn revert | svn revert plik.txt | Przywraca kopię roboczą pliku do stanu zgodnego z repozytorium, czyli wycofuje wprowadzone lokalnie zmiany |
svn status [ścieżka] | svn status | Pokazuje stan kopii roboczej, czyli informacje o zmianach lokalnych i zdalnych (dokonanych w repozytorium po pobraniu pliku/katalogu do kopii roboczej) |
svn stat/st… | Skróty do status | |
svn switch | svn switch svn://server:port/ścieżka/tag/rel_1.5 | Aktualizuje kopię roboczą do innego URLa; wygodne do przełączenia do kolejnego (lub powrót do poprzedniego) taga |
svn sw… | Skrót do switch | |
svn update | svn up plik1.txt plik2.txt | Nanosi zmiany z repozytorium do kopii roboczej. Przy istniejących zmianach lokalnych, następuje próba „inteligentnego” zcalenia zmian lokalnych i zmian w repozytorium |
svn up… | Skrót do update |
No, może przesadziłem stwierdzeniem, że to są podstawowe polecenia… Ustawianie atrybutów (properties) czy switch raczej na początek się nie przyda, ale wcześniej czy później pewnie tak. Każda z komend ma wiele opcji, przez co może się wydawać że korzystanie z niego jest trudne, więc na początek skup się na komendach checkout, update, add, commit. Będziesz dzięki nim mógł stworzyć kopię roboczą projektu z repozytorium, zaktualizować, dodać własne pliki i katalogi, oraz wysłać własne zmiany do repozytorium, aby inni mogli z nich korzystać. Na kolejne komendy przyjdzie pora :)