Wykorzystanie SVN w codziennej pracy z Ubuntu 28


Każdy programista i deweloper potrzebuje narzędzia, dzięki któremu będzie mógł w miarę sprawnie panować nad zmianami, które wprowadza do kodu. Nie jest ważne, czy pisze się w C, JAVA, czy też nawet w „zwykłym” HTML. Takie narzędzia konieczne są tym bardziej, im większy jest projekt, albo im więcej osób nad nim pracuje.

Tutaj przydają się narzędzia określane jako „systemy kontroli wersji” (ang. version/revision control system), dzięki którym możliwe jest śledzenie zmian w kodzie źródłowym programów, oraz łączenie i modyfikacje zmian wprowadzanych do projektu przez wiele osób. Takich systemów jest mnóstwo, począwszy od RCS, bardzo popularny CVS, SVN (zwany także Subversion), GIT, BitKeeper, SVK i wiele innych.

Systemy kontroli wersji przydają się nie tylko w pracy informatyków–programistów. Łatwo sobie wyobrazić sytuację, gdy administrator sieci chciałby wersjonować sobie swoje skrypty, ludzie odpowiedzialni za tworzenie np. umowy chcą mieć kontrole nad tym, kto jakie paragrafy do umowy dopisuje, a pani Krystyna z gazowni nie chciałaby stracić listy prywatnych numerów telefonów.

Najbardziej popularnym systemem kontroli wersji jest bez wątpienia CVS, który ma jednak swoje wady i powoli jest wypierany przez Subversion (SVN). Przewaga SVN nad CVS polega między innymi na:

  • pilnowaniu zmian w nazwach plików i katalogów,
  • możliwości użycia serwera Apache lub dedykowanego serwera uruchamianego jako inetd albo osobny demon,
  • atomowości transakcji, dzięki czemu jesteśmy pewni, że każda zmiana jest zapamiętana w całości i żadna awaria w komunikacji nie jest w stanie zepsuć nam naszej pracy,
  • efektywnej obsłudze plików binarnych,
  • efektywniejszym zarządzaniu repozytorium poprzez stosowanie aliasów, a nie kopiowanie kodu.

W poradniku posłużę się właśnie SVN, który do domowych zastosowań – a nawet tych bardziej profesjonalnych – wystarczy w zupełności.

Instalacja Subversion

Instalacja SVN w Ubuntu jest tak samo prosta, jak instalacja innych programów z repozytorium. Wystarczy:
sudo apt-get install subversion
po czym będziemy mogli już korzystać z SVN z linii poleceń. Na początek założymy repozytorium, czyli miejsce, gdzie będą przechowywane informacje o zmianach w kodzie. Repozytorium może znajdować się w dowolnym miejscu na dysku, jednak warto zagospodarować na nie ciut miejsca. W moim przykładzie repozytorium SVN założę w katalogu /var/svn:
sudo svnadmin create /var/svn

SVN umożliwia nam dostęp do repozytorium z poziomu serwera Apache, przez co mamy do dyspozycji wszelkie jego zalety, np. szyfrowanie strumienia protokołem SSL, wykorzystanie certyfikatów autoryzujących, itp. Zakładam, że serwer Apache jest już skonfigurowany i działa, a opis jego uruchomienia jest tu zbędny. Żeby zainstalować obsługę SVN w Apache instalujemy pakiet libapache2-svn:
sudo apt-get install libapache2-svn
Konfiguracja modułu zapisana jest w pliku tekstowym, który teraz trzeba przeedytować:
sudo gedit /etc/apache2/mods-enabled/dav_svn.conf
Przede wszystkim włączamy obsługę SVN poprzez usunięcie komentarza z linii:

DAV svn

A następnie ustawiamy ścieżkę do katalogu z repozytorium SVN:

SVNPath /var/svn

Ustawiamy podstawową autoryzację poprzez usunięcie komentarza:

AuthType Basic
AuthName „Subversion Repository”
AuthUserFile /etc/apache2/dav_svn.passwd

Sprawdzamy, czy linijki z tagiem <Location> są odkomentowane. Jeżeli wszystko jest ok, to można zapisać plik. Teraz ustawiamy użytkowników, którzy mogą korzystać z repozytorium, a którzy są zdefiniowani w pliku /etc/apache2/dav_svn.passwd:
sudo htpasswd2 -m /etc/apache2/dav_svn.passwd [nazwa_uzytkownika]
System poprosi o hasło użytkownika, po czym zapamięta wprowadzoną osobę. Ostatnim krokiem przygotowującym SVN do współpracy z Apachem jest ustawienie właściciela katalogu z repozytorium na takiego użytkownika, na jakim działa Apache. Jest to konieczne, ponieważ SVN poprzez Apache będzie wykonywał zmiany w repozytorium i bez tego nie pozwalałyby na to ustawione uprawnienia do plików i katalogów. W domyślnej instalacji Apache działa na koncie użytkownika www-data i takie konto ustawiam jako właściciela repozytorium:
sudo chown -R www-data:www-data /var/svn
Teraz pozostaje tylko restart serwera www i można cieszyć się z działającego narzędzia.
sudo /etc/init.d/apache2 restart
Po wpisaniu adresu http://localhost/svn zobaczymy zgłoszenie SVN.

Zgłoszenie Subversion w przeglądarce
Obrazek 1. Zgłoszenie Subversion w przeglądarce

Instalacja RapidSVN – nakładki graficznej na Subversion

Korzystanie z SVN może odbywać się z poziomu linii poleceń, albo poprzez graficzne nakładki, jak na przykład RapidSVN:
sudo apt-get install rapidsvn
Niestety RapidSVN nie umieszcza się w menu Gnoma, więc trzeba samemu utworzyć aktywatora, albo uruchamiać narzędzie z linii poleceń:
rapidsvn&

Wykorzystanie Subversion

Żeby móc korzystać z dobrodziejstw SVN trzeba umieścić w jego repozytorium kod, który ma być kontrolowany. W terminologii SVN nazywa się to „importem”. Zakładając, że projekt nazywa się „Hello_world”, a kod znajduje się w katalogu ~/public_html/hw, to można to zrobić w RapidSVN poprzez Repository->Import:

Import do repozytorium Subversion za pomocą RapidSVN
Obrazek 2. Import do repozytorium Subversion za pomocą RapidSVN

Odpowiednikiem tego w konsoli jest polecenie svn import:
svn import ~/public_html/hw http://localhost/svn/hw -m "Komentarz"
Żeby pobrać kod z repozytorium do edycji wykonujemy coś, co po angielsku nazywa się „Checkout”, a po polsku nie ma chyba odpowiednika. W RapidSVN służy do tego opcja Bookmarks->Checkout New Working Copy:

Pobranie kodu z repozytorium Subversion za pomocą RapidSVN
Obrazek 3. Pobranie kodu z repozytorium Subversion za pomocą RapidSVN

Pobranie kodu można zrobić nie tylko za pomocą RapidSVN, ale także z konsoli:
svn co http://localhost/svn/hw
które to polecenie pobierze z repozytorium pliki do aktualnego katalogu. Checkout można wykonać z dowolnego komputera, który ma dostęp do repozytorium przez serwer Apache i w ten sposób móc edytować pliki z repozytorium w domu, szkole, u kolegi. Warto tutaj dodać, że w tak ściągniętych danych z repozytorium będą znajdować się pliki i katalogi ukryte, które służą do poprawnego działania Subversion i których nie wolno ruszać.

Typowa praca z SVN polega na kilku prostych krokach. Na początku uaktualniamy naszą lokalną kopię kodu i porównujemy ją z kodem w repozytorium, żeby sprawdzić, czy nikt w tym czasie nie poprawił kodu, oraz żeby połączyć ewentualne zmiany. Do tego służy opcja Modify->Update w RapidSVN, albo polecenie
svn update
Następnie pracujemy z kodem tak, jak bez systemu kontroli wersji. Zatwierdzenie wprowadzonych zmian to opcja Modify->Commit, albo polecenie
svn commit [plik]
Warto stosować komentarze opisujące wprowadzane zmiany, bo dzięki temu w przyszłości będzie można zobaczyć, co w kodzie się zmieniało. Żeby dodać komentarz należy w momencie zatwierdzania zmian zastosować parametr „-m”, np.:
svn commit -m "Usunięcie buga przy definiowaniu połączenia z bazą"
Załóżmy jednak, że chcemy zorientować się, jakie zmiany wprowadziliśmy w stosunku do wersji w repozytorium. Do tego służy opcja Query->Diff w RapidSVN, albo polecenie
svn diff [plik]
A co jeżeli chcemy pobrać z repozytorium wersję finalną naszego projektu, żeby chociażby móc sprzedać efekty naszej ciężkiej pracy? Nie jest dobrym pomysłem wykonywanie checkoutu, bo w pobranych plikach będzie sporo danych wewnętrznych Subversion. Do tego celu służy eksport:
svn export http://localhost/svn/hw
albo opcja Repository->Eksport w RapidSVN.

To tylko część funkcjonalności. Systemy kontroli wersji, w tym także Subversion, pozwalają na rozdzielanie kodu na kilka niezależnych od siebie ścieżek rozwoju, a potem łączenie w wersji produkcyjnej wybranej funkcjonalności. Warto wspomnieć też o możliwościach rozwiązywania konfliktów, gdy kilka osób jednocześnie edytuje ten sam plik. Całości dopełnia możliwość powrotu projektu do stanu z dowolnego dnia, albo pobranie z repozytorium plików w dowolnej wersji. Więcej o możliwościach SVN można przeczytać wydając polecenie
svn help
albo udając się na stronę główną projektu Subversion: http://subversion.tigris.org.

Konfiguracja SVN może zabrać dosłownie chwilę, ale zalety stosowania tego rozwiązania wydają się znaczne. Szczególnie wtedy, gdy okaże się, że trzeba wycofać wprowadzone zmiany, albo przeprowadzić małe dochodzenie, kto napsuł nam nasz projekt…

Warto poczytać:


Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

28 komentarzy do “Wykorzystanie SVN w codziennej pracy z Ubuntu

  • kwalo

    Z svn korzystam już od dłuższego czasu, ale zawsze robiłem to z linii poleceń. Smiecho, Twoim artykułem natchnąłeś mnie do ustawienie modułu svn w serwerze apache’a.

    Dzięki za dobry artykuł! Oby więcej takich w czytelni!

  • Bzyk

    Ciekawy artykuł. Może się skuszę do przetestowania. Zawsze CVS (i SVN) odrzucał mnie na kilometr ale chyba nie taki diabeł straszny. Gdybyś jeszcze skrobnął akapit jak kontrola wersji wygląda fizycznie na dysku (jakieś pliki .diff czy też zupełnie coś innego) to byłbym rad.

  • kwalo

    @Bzyk, przechowywanie tych danych na dysku to dość złożona sprawa. W przeciwieństie do cvs, svn wykorzystuje do tego bazę danych BerkeleyDB. W cvs są pliki historii, ale wprowadzają ograniczenie (np. nie można zmienić nazwy pliku, przy zachowaniu historii zmian).

    W repozytorium przechowywane są różnice w wersjach plików. Dodatkowo można tworzyć gałęzie (branches), co równierz sprowada się do przechowywania różnic. Polecam lekturę książki o svn. Przynajmniej pierwszego rozdziału, który jest wprowadzeniem do systemu kontroli wersji.

    Niestety książka jest po angielsku. Może ktoś w wolnej chwili podejmie się jej przetłumaczenia do Czytelni? 😉

  • nospeq

    czy jest mozliwe ustawienie tak svn aby mi robilkopie zapasowe dyskow po sieci? chodzi o to aby w sieci z 10 kompami z winXP, ustawic serwer z linuxem i svn, i zeby regularnie mi robil kopie wszystkich dokumentow, lub calych dyskow, i w razie awari abym mogl odtworzyc dokumenty. niw chodzi o prace grupowa na jakim projektem. chcialbym wykorzystac svn do rbienia kopi bezpieczenstwa.

  • marshal

    a co z takim błędem:

    sudo /etc/init.d/apache2 restart
    * Forcing reload of web server (apache2)… Syntax error on line 16 of /etc/apache2/mods-enabled/dav_svn.conf:
    DAV not allowed here

    przez to wogóle nie można nic importować a rapidsvn krzyczy:

    Error: Error while performing action: żądanie PROPFIND nie powiodło się dla '/svn/folder’
    PROPFIND z '/svn/folder’: 405 Method Not Allowed (http://localhost)

  • Skowron

    @marshal – miałem podobny błąd, sporo się na szukałem a chodzi tylko o to aby odkomentować również linijkę:

    bezpośrednio nad DAV svn no i zamykającą ją na końcu:

    🙂

    powodzenia i pozdrowienia 🙂

  • Borris

    Thanks Skowron,

    For anyone else that has the Syntax error on line 16 of /etc/apache2/mods-enabled/dav_svn.conf DAV not allowed here error, the problem for me was that I forgot to uncomment the line, which is above 'DAV svn’. I think this is what Skowron told marshal….

  • Borris

    Sorry… it stripped out the greater than and less than sign. The line I forgot to uncomment was Location /svn, and the Location /svn as well.

  • ksirg

    Nie wiem jak u was, lecz u mnie nie chodzi autentykacja tzn. mogę zrobić update, commit bez podawania usera i hasła.
    Dodatkowo przydał by się opis konfiguracji wielu repo, gdyż często jedno repozytorium jest przeznaczane na jeden projekt.

  • slawek

    wszystko swietnie tylko czy da sie moze jakos bez zbednych ceregieli zainstalowac cos dzieki czemu polecenie htpasswd2 po prostu zadziala (jest to jakis bug z tego co doczytalem)
    moze ma ktos jakas solucje?

  • TomekK

    Wielkie dzięki za tutorial. Krok po kroku jasno i na temat.
    jedna uwaga w czystej instalacji zamiast
    sudo htpasswd2 -m /etc/apache2/dav_svn.passwd [nazwa_uzytkownika]
    musiałem dziobnąć
    sudo htpasswd -c /etc/apache2/dav_svn.passwd [nazwa_uzytkownika]
    ku stworzeniu użyszkodnika.

    Jeszcze raz ukłony za łopatologiczne wyjaśnienie

  • Dr Vito

    Ja mam w logach:

    [Thu Jan 29 11:09:01 2009] [error] [client 85.14.100.4] Could not open the requested SVN filesystem [500, #2]
    [Thu Jan 29 11:09:29 2009] [error] [client 127.0.0.1] (20014)Internal error: Can’t open file '/home/subversion/format’: No such file or directory
    [Thu Jan 29 11:09:29 2009] [error] [client 127.0.0.1] Could not fetch resource information. [500, #0]
    [Thu Jan 29 11:09:29 2009] [error] [client 127.0.0.1] Could not open the requested SVN filesystem [500, #2]
    [Thu Jan 29 11:09:29 2009] [error] [client 127.0.0.1] Could not open the requested SVN filesystem [500, #2]

    Kiedy stworzylem plik format to mu nic nie dalo. Co powinien zawierac?

  • kantek

    Proszę o pomoc.

    Przy imporcie wyskakuje mi cały czas błąd:
    Error: Error while performing action: Can’t open file '/var/svn/db/txn-current-lock’: Permission denied

    chmod nadany poprawnie !!! user ma pełne prawa do katalogu svn

    Pozdrawiam

  • nimX

    Witam, dziękuję za wartościowy artykuł, dzięki któremu pierwsze potyczki z konfiguracją SVNa są miłą przygodą. Prócz drobnych błędów, o których wspomnieli forumowicze, brak uwag. Jednak mając już możliwość wypowiedzi 🙂 dodam że utworzenia repozytorium bezpośrednio w katalogu /var/www, nie jest sprytną myślą, bowiem dostarcza on wielu wrażeń, jednak z negatywną wartością dodaną:-) Jeśli kogoś tego typu konfiguracja jednak nurtuje, zachęcam do lektury pod adresem: http://www.hossainkhan.info/content/dealing-svn-propfind-failed-301-moved-permanently-error.

    Pozdrawiam i zyczę udanych projektów.

  • Dlugi

    Szczeliles miszczu byka

    nie ma czegos takiego jak httpasswd2 jest poprostu htpasswd

    tak jedno z Twoich polecen winno wygladac:

    sudo htpasswd -m /etc/apache2/dav_svn.passwd [nazwa_uzytkownika]

    poza tym swietny artykul 🙂

  • regisu

    Takiego arta właśnie potrzebowałem na początek. Skryptów przybywa i okazuje się, że na każdym serwerze jest nieco inna wersja. Może to pomoże mi się zorganizować.

  • Artur

    jeżeli napotkacie komunikat błędu (a tak będzie na Ubuntu 12.04 beta):

    No apache MPM package installed

    należy użyć polecenia:

    sudo apt-get install apache2-mpm-worker

    Kolejnym bledem przy prubie uruchomienia Apache 2 bedzie prawdopodobnie:

    „Could not reliably determine the server’s fully qualified domain name, using 127.0.1.1 for ServerName” – lub podobny

    Rozwiązanie jest proste. Wystarczy edytować plik httpd.conf i wpisać:

    ServerName localhost

    Nic więcej tylko to żadnych ip … dzięki temu apache poprawnie zidentyfikuje plik i tyle.

    sudo /etc/init.d/apache2 restart – no i powinno już działać

    nie zapomnijcie ze na ubuntu 12.04 polecenie htpasswd2 należy zamienić na htpasswd