Subversion dla każdego
12 stycznia 2006, michuk
Systemy kontroli wersji jak CVS, Subversion czy Darcs od dawna są chlebem powszednim programistów na całym świecie. W artykule opiszemy w jaki sposób Subversion może pomóc nam w lepszym sprawowaniu pieczy nad własnymi domowymi dokumentami.
Po co nam kontrola wersji?
Warto zacząć od tego czym jest w ogóle kontrola wersji. Cytując Wikipedię:
System kontroli wersji służy do śledzenia zmian głównie w kodzie źródłowym oraz pomocy programistom w łączeniu i modyfikacji zmiany dokonanych przez wiele osób w różnych momentach.
Jednak systemy kontroli wersji to nie tylko narzędzie programistów - mają one coś do zaproponowania również zwykłym, domowym użytkownikom komputera. Pomyślmy, ile razy przypadkowo skasowaliśmy jakiś ważny plik albo jego część? Na przykład numer naszej dentystki albo adres dalekiego znajomego? Ile razy chcieliśmy uzyskać szybki zdalny dostęp do jakiegoś folderu? Albo modyfikować te same dane z kilku miejsc (np. z domu i z pracy), bez konieczności ciągłego dbania o to, żeby pracować na aktualnej wersji? To wszystko i wiele więcej zapewni nam Subversion. Dzięki Subversion będziemy mogli m.in:
- lepiej zapanować nad ważnymi dla nas dokumentami,
- uzyskać dostęp do aktualnej, ale i poprzednich wersji każdego ważnego pliku z jakiegokolwiek miejsca w Internecie, po podaniu hasła,
- modyfikować nasze dokumenty niezależnie od lokalizacji, nie troszcząc się o synchronizację zmian.
Jeśli to Was zachęciło, zapraszam do zapoznania się ze szczegółami technicznymi instalacji, konfiguracji i użycia Subversion w praktyce.
Subversion a CVS
Program Subversion powstał w celu stworzenia systemu kontroli wersji uzupełniającego luki przestarzałego (ale jakże popularnego) CVS. Subversion jest bezpieczny (o bezpieczeństwo dba moduł SSL serwera Apache) i pozbawiony kilku denerwujących niedoróbek CVS-a, jak brak kontroli wersji nad katalogami i metadanymi czy brak transakcyjnych commitów. Do celów domowych wystarczyłby zapewne i zwykły CVS, ale skoro powstał pomysł opisania systemu kontroli wersji od zera, wydaje się, że nie ma potrzeby zaprzątania sobie głowy czymś co powoli, ale bezpowrotnie odchodzi w niepamięć. Subversion jest po prostu o wiele lepszym programem i z tego powodu właśnie nim zajmiemy się w tym artykule.
Instalacja Subversion
Zakładając, że używamy dystrybucji oferującej porządne zarządzanie pakietami, Subversion powinno być w domyślnym repozytorium oprogramowania. Do działania programu będziemy potrzebowali również serwer Apache 2, który zapewnia uwierzytelnianie oraz umożliwia przeglądanie zasobów przez interfejs WWW.
Przykładowo, w Debianie Sarge lub Ubuntu Breezy, wykonujemy polecenie:
apt-get install apache2 subversion libapache2-svn \
subversion-tools
W tym momencie mamy już na dysku zainstalowane całe potrzebne oprogramowanie i możemy przejść do konfiguracji.
Uwaga: Możemy też używać Subversion bez zainstalowanego Apache 2. W takim wypadku będziemy korzystać z autonomicznego serwera svnserve, działającego jako usługa inetd lub jako demon, z prostym uwierzytelnianiem (jest też możliwość skorzystania również z tunelu SSH). W tym artykule nie będziemy się jednak zajmować tą metodą.
Konfiguracja Subversion
Na początku tworzymy katalog, w którym znajdować się będą nasze repozytoria SVN. Przykładowo:
mkdir -p /home/subversion/public
W omawianym przypadku publicznie dostępne repozytoria będziemy przechowywać w katalogu /home/subversion/public. Oczywiście to tylko przykład. Katalog może równie dobrze znajdować się w /var/lib czy też bezpośrednio w głównym węźle plików.
Kolejny krok to założenie pierwszego repozytorium. W naszym przypadku będzie to repozytorium ‘faq’, słuące do przechowywania wszelkich pomocnych skryptów, trików i opisów konfiguracji programów linuksowych. Komenda zakładająca nowe repozytorium o nazwie ‘faq’ to:
svnadmin create faq
W tym momencie Subversion mamy już wstępnie skonfigurowane i gotowe do boju. Pora na Apache.
Konfiguracja Apache 2
Kolejnym, bardzo istotnym krokiem jest konfiguracja serwera Apache. Będziemy musieli wygenerować certyfikat oraz zmodyfikować kilka plików konfiguracyjnych, a także stworzyć użytkowników Subversion i określić ich prawa. Do dzieła!
Generujemy certyfikat SSL
Subversion wykorzystuje uwierzytelnianie SSL dostarczone przez Apache 2. Aby z niej skorzystać, musimy wygenerować certyfikat SSL poleceniem:
apache2-ssl-certificate
Przy zakładaniu certyfikatu konfigurator pyta nas o kilka informacji, takich jak: kod państwa, nazwa miejscowości, czy organizacja wystawiająca certyfikat. Wymagana do założenia certyfikatu jest jedynie nazwa serwera (w naszym przypadku: foka). Certyfikat po wygenerowaniu zapisze nam się zapewne do pliku /etc/apache2/ssl/apache.pem. Jeśli jest inaczej, zapiszmy sobie ścieżkę. Będzie potrzebna już niedługo.
Uwaga: ta metoda generowania certyfikatu może spowodować błąd, który zgłosiłem na forum Subversion: SSL negotiation failed: SSL error: unknown protocol. W takim przypadku warto zastosować się do porady z forum Fedory i wygenerować klucz. Po kolei wykonujemy w takim przypadku polecenia:
openssl req -new > new.cert.csr
openssl rsa -in privkey.pem -out new.cert.key
SSLCertificateFile /etc/pki/tls/certs/new.cert.cert
SSLCertificateKeyFile /etc/pki/tls/private/new.cert.key
Uaktywniamy obsługę SSL w Apache
Aby uaktywnić obsługę SSL w Apache 2 musimy po pierwsze dodać w pliku /etc/apache2/ports.conf linijkę
Listen 443
To spowoduje, że nasz serwer zacznie nasłuchiwać również na porcie 443 (domyślny port SSL).
Następnie musimy stworzyć w katalogu /etc/apache2/mods-enabled/ linki do plików ssl.conf i ssl.load z /etc/apache2/mods-available
ln -s /etc/apache2/mods-available/ssl.load \
/etc/apache2/mods-enabled/
ln -s /etc/apache2/mods-available/ssl.conf \
/etc/apache2/mods-enabled/
dzięki czemu moduły odpowiadające za obsługę SSL zostaną załadowane przy starcie Apache.
Uaktywniamy obsługę Subversion w Apache
Aby uaktywnić obsługę Subversion w Apache 2 musimy, podobnie jak to było z SSL, stworzyć w katalogu /etc/apache2/mods-enabled/ link do pliku dav_svn.load z /etc/apache2/mods-available:
ln -s /etc/apache2/mods-available/dav_svn.load \
/etc/apache2/mods-enabled/
Moduły odpowiadające za obsługę Subversion zostaną załadowane przy starcie Apache, razem z innymi modułami Apache. W omawianym przypadku nie będziemy konfigurować dodatkowo modułu dav_svn (domyślna konfiguracja nam odpowiada), tak więc pliki dav_svn.conf nie musi znaleźć się w mods-enabled. Nic nie stoi jednak na przeszkodzie, żeby tam się znalazł, jeśli potrzebujemy skonfigurować obsługę SVN w sposób specjalny.
Konfigurujemy wirtualnego hosta
W kolejnym kroku tworzymy plik /etc/apache2/sites-available/subversion. Przykładowa konfiguracja, wraz z opisem istotnych linijek poniżej:
# Adres IP i port - najczęściej będzie to adres komputera,
#na którym stawiamy serwer oraz port 443 (SSL)
# W tym przypadku adres IP należy do sieci wewnętrznej,
# ponieważ mój serwer SVN działa właśnie w takiej sieci,
# a na zewnątrz udostępniany jest poprzez przekierowanie
# portu 443
# na sprzętowym firewallu.
<VirtualHost 192.168.0.1:443>
# Administrator serwera SVN
ServerAdmin michuk@jakilinux.org
# Nazwa serwera (np. nazwa komputera)
ServerName foka
# Uaktywniamy SSL
SSLEngine On
# Podajemy lokalizację wygenerowanego pliku z certyfikatem
SSLCertificateFile /etc/apache2/ssl/apache.pem
# Konfigurujemy publiczny katalog do
# przeglądania repozytorium
<Location /public>
# Uprawnienia do katalogu - ustawiamy dostęp ze
# wszystkich adresów
Order allow,deny
Allow from all
# Każemy użyć modułu svn_dav zamiast zwykłego webdav
DAV svn
# ścieżka do nadrzędnego katalogu z repozytoriami
SVNParentPath /home/subversion/public
# ścieżka do pliku z definicją uprawnień dostępu
# dla użytkowników i grup
AuthzSVNAccessFile \
/etc/apache2/auth-files/public-svn-authzfile
# Używamy metody HTTP Basic Authentication
Satisfy Any
Require valid-user
AuthType Basic
# Tekst pojawiający się w okienku logowania Apache
AuthName "jakilinux.org Subversion Repository"
# Lokalizacja pliku z zaszyfrowanymi hasłami użytkowników SVN
AuthUserFile /home/subversion/.dav_svn.passwd
</Location>
# Określamy poziom logowania i pliku logów
ErrorLog /var/log/apache2/error.log
LogLevel warn
CustomLog /var/log/apache2/access.log combined
</VirtualHost>
Bardzo istotne w tej konfiguracji są linijki:
AuthzSVNAccessFile /etc/apache2/auth-files/public-svn-authzfileAuthUserFile /home/subversion/.dav_svn.passwd
Aby uaktywnić konfigurację, musimy stworzyć wspomniane dwa pliki (o tym poniżej), a następnie utworzyć linki symboliczne do katalogu /etc/apache2/sites-enabled:
ln -s /etc/apache2/sites-available/subversion \
/etc/apache2/sites-enabled/
Uwaga: Jeśli wygenerowaliśmy klucze poleceniem openssl, należy zamiast jednego pliku z certyfikatem podać dwa, np. w taki sposób:
SSLCertificateFile /etc/pki/tls/certs/new.cert.cert
SSLCertificateKeyFile /etc/pki/tls/private/new.cert.key
Konfigurujemy uprawnienia dostępu do repozytoriów
Aby korzystać z SVN musimy stworzyć użytkowników posiadających uprawnienia do ściągania bądź modyfikacji danych z repozytoriów. Służy do tego polecenie htpasswd. Tworzymy jednocześnie plik /home/subversion/.dav_svn.passwd oraz pierwszego użytkownika Subversion:
htpasswd -cm /home/subversion/.dav_svn.passwd michuk
Kolejnych użytkowników tworzymy już bez parametru (-c) zakładającego plik:
htpasswd -m /home/subversion/.dav_svn.passwd wiesio
htpasswd -m /home/subversion/.dav_svn.passwd zdzisio
Czas teraz na stworzenie pliku /etc/apache2/auth-files/public-svn-authzfile, w którym przechowywane będą informacje na temat dostępu poszczególnych użytkowników SVN do repozytoriów. Przykładowa, bardzo prosta wersja uprawnień:
# Konfiguracja grup
[groups]
owner = michuk
faq-writers = michuk
jakilinux-developers = michuk, bober, safin
# Konfiguracja repozytoriów
# Repozytorium nadrzędne. Tylko właściciel (michuk) będzie
# mógł dodawać nowe repozytoria
[/]
@owner = rw
# Repozytorium FAQ - mogą go używać tylko członkowie grupy
# faq-writers. Brak dostępu z zewnątrz
[faq:/]
@faq-writers = rw
# Repozytorium jakilinux.org - mogą je modyfikować
# tylko członkowie grupy jakilinux-developers.
# Przeglądać mogą je wszyscy (opcja * = r)
[jakilinux.org:/]
@jakilinux-developers = rw
* = r
Oczywiście to tylko przykładowa definicja uprawnień. Każdy użytkownik musi być najpierw dodany programem htpasswd, aby móc korzystać z repozytorium SVN (nie licząc anonimowych użytkowników przeglądających repozytoria).
Uwaga: Możliwe jest również skorzystanie z uwierzytelniania systemowego (PAM), jeśli oddzielne grupy użytkowników dla SVN to dla nas coś, czego nie możemy przeżyć. Tego rodzaju integracją nie będziemy się jednak zajmować w tym HOWTO. Odsyłam do dokumentacji Subversion i Apache 2.
Uprawnienia systemowe
Na koniec jeszcze jedna, bardzo istotna rzecz. Aby uwierzytelnianie przez Apache 2 zadziałało, właścicielem katalogu z repozytoriami Subversion powinien być właściciel procesu Apache 2. W Debianie jest to domyślnie użytkownik www-data. W innych dystrybucjach może to być inny użytkownik, np. apache czy apache2. W każdym bądź razie, jako ostatni punkt programu, ustalamy uprawnienia do katalogu /home/subversion:
chown -R www-data:www-data /home/subversion/
W tym momencie, jeśli wszystkie czynności wykonaliśmy poprawnie, powinniśmy cieszyć się działającym i skonfigurowanym Subversion.
Restart Apache 2
Nie zapomnijmy, przed zgłaszaniem błędów w artykule zrestartować naszego serwera Apache 2:
/etc/init.d/apache2 restart
Podstawy użycia
Uff… W końcu przebrnęliśmy przez konfigurację. Możemy zacząć używać Subversion w praktyce. Na początku proponuję dodać kilka plików do utworzonego wcześniej repozytorium faq. Wchodzimy więc do lokalizacji zawierającej folder, który chcemy zaimportować do repozytorium i wpisujemy:
svn --username michuk import ~/faq \
https://192.168.0.1/public/faq -m "Komentarz"
Ta operacja zaimportuje nam zawartość folderu ~/faq do repozytorium faq znajdującego się na serwerze z SVN, dodając odpowiedni komentarz (opcja -m). Komentarze pomogą nam w przyszłości wyszukiwać właściwą wersję pliku, jeśli będziemy chcieli odzyskać wersję sprzed wykonania konkretnej zmiany.
![]()
Rys 1. Subversion elegancko rozwiązuje konflikty
Aby sprawdzić, czy pliki zaimportowały się poprawnie do repozytorium, wystarczy wejść na stronę: https://192.168.0.1/public/faq i zalogować się. Zawartość repozytorium będziemy mogli zawsze przeglądać przez interfejs WWW.
Jeśli chcemy, możemy również ściągnąć całe repozytorium na dysk innego komputera (np. w pracy). Wykonujemy w tym celu polecenie checkout (
svn co https://192.168.0.1/public/faq
W każdym miejscu, w którym mamy ściągnięte repozytorium faq, możemy teraz modyfikować dowolne pliki wchodzące w jego skład oraz zatwierdzać zmiany (przesyłane są one wtedy do głównego repozytorium). Aby pobrać aktualną wersję wszystkich plików z aktualnego katalogu wykonujemy komendę:
svn update
Natomiast, jeśli dokonaliśmy zmian w którymś z plików i chcemy je przesłać do repozytorium SVN (oczywiście operacja powiedzie się tylko w przypadku, gdy mamy dostęp do zapisu w danym repozytorium) użyjemy do tego komendy:
svn commit plik
Inną bardzo przydatną opcją w Subversion jest możliwość przeglądania zmian, jakie zaszły w danym pliku od ostatniej aktualizacji. Do przeglądania ostatnich zmian lokalnych możemy użyć komendy:
svn diff
Jeśli pracujemy w kilka osób na jednym pliku, łatwo jest nadpisać przypadkowo czyjeś zmiany. Na szczęscie dzięki inteligentnemu scalaniu oraz możliwości ręcznego decydowania o aplikacji poszczególnych zmian, utrata danych przestaje być praktycznie problemem (zmiany lokalne automatycznie scalane są ze zmiamami dokonanymi przez innych użytkowników podczas aktualizacji pliku komendą svn update).
Jeśli jednak, mimo wszystko, chcemy czasowo zabronić innym użytkownikom zatwierdzania zmian z danym pliku, możemy użyć “zamka”:
svn lock plik
Zamek działa domyślnie do kolejnego zatwierdzenia zmian (svn commit). Jeśli jednak na pliku znajduje się atrybut –no-unlock (dodany np. podczas tworzenia bądź zatwierdzania zmian), zamek możemy zwolnić tylko przez wykonanie polecenia svn unlock plik.
Więcej opcji programu svn (jak na przykład odzyskiwanie starszych wersji pliku, sprawdzanie statusu pliku, przemieszczanie plików i katalogów w repozytorium czy usuwanie plików) możemy poznać studiując FAQ Subversion dostępne w Internecie lub przeglądając pomoc podręczną (svn help) lokalnie, na komputerze z zainstalowanym klientem SVN.
![]()
Rys 2. eSVN - graficzna nakładka na Subversion
Jeśli nie odpowiada nam praca w konsoli, zawsze możemy zainstalować sobie którąś z nakładek graficznych na Subversion. Najpopularniejsze z nich to:
- kdesvn - graficzny klient Subversion świetnie integrujący się z KDE i Konquerorem
- Rapid SVN - popularny program do zarządzania Subversion, napisany z użyciem wxWidgets (działa w Linuksie i MS Windows)
- eSVN - kolejna nakładka graficzna na SVN, napisana w Qt
- WebSVN - nakładka webowa, napisana w PHP i działająca w przeglądarce internetowej
- TortoiseSVN - świetny klient SVN dla Windows, integruje się z systemem podobnie jak kdesvn, tylko w nieco większym stopniu
Po (nieco pracochłonnym) skonfigurowaniu SVN i założeniu repozytorium, praca z SVN w trybie konsoli jest bezproblemowa i zazwyczaj ogranicza się do pobierania nowej wersji i zatwierdzania zmian. Tym niemniej, jeśli ktoś rzeczywiście nie może się obejść bez klikania, to instalacja którejś z nakładek (polecam kdesvn) może okazać się dobrym pomysłem przy ujarzmianu programu. Nakładki szczególnie przydają się, gdy chcemy porównać ze sobą konkretne wersje danego pliku, wybierając odpowiednie pliki z logu SVN. Do samoego porównania kdesvn może użyć dowolnej zewnętrznej aplikacji (np. KDiff3 lub vimdiff).
Podsumowanie
System kontroli wersji może znacznie ułatwić pracę z dużą liczbą dokumentów, a także zapobiec wielu tragediom związanym z utratą danych. Gdy już stworzymy swoje domowe repozytorium Subversion, korzystanie z jego dobrodziejstw to czysta przyjemność. Zachęcam do wypróbowania tego sposobu w praktyce.
Referencje
Pisząc ten artykuł korzystałem z następujących źródeł:
- Oficjalna strona projektu Subversion
- Version Control with Subversion - aktualizowana na bieżąco książka online/manual autorstwa Ben Collins-Sussman, Brian W. Fitzpatrick oraz C. Michael Pilato
- Debian Sarge + Apache 2 + Subversion
- Gentoo Wiki: Subversion i HOWTO Apache2 with subversion SVN and DAV
Liczba komentarzy: 22
Komentarze do tego wpisu są wyłączone.




Połowa artykułu to opis instalacji. Po tytule spodziewałem się szerszego opisu korzystania z subversion. Szkoda.
no wlasnie, a jak to sie sprawdza u was w praktyce?
Przydałby się przykład automatycznego wrzucania całych katalogów na serwer i automatycznego sciągania całych katalogów na lokalny komp. To może być swietnym rozwiązaniem synchronizacji wielu plików i wielu katalogów, jeśli się pracuje raz w domu a raz w pracy.
Jak są rozwiązywane konflikty w przypadku plików binarnych? Czyli np. poprawiłem w domu obrazek, który jest w CVS. Czy jak zrobię commit a potem w pracy update to będę miał nowszą wersję obrazka (według daty) czy jakieś posklejane binarne badziewie?
a ten jak zawsze narzeka
dobry artykul dla laika
ktos obeznany i tak by z faq nie skozystal, choc wskazane referencje - coz wiecej potrzeba?
eSVN jest klientem napisanym przy pomocy QT, ale zdecydowanie nie tylko dla KDE - nie korzysta z KDEowych bibliotek, ja takich nie mam w systemie, a eSVN mi smiga)
Serwer Apache do kontroli dokumentow? :/
Sam svnserve nie wystarcza? :>
Nie narzekam, jestem laikiem, nie znam wcale svn ani cvs, a chciałbym z podanych wcześniej powodów. Raz próbowałem poznać cvs i poległem:)
A nie wystarczy:
svn ls file:///var/svn/mylove
Po co komu loklanie serwer :> (nawet lokalnie mozna kozystac z praw dostepu i hasel, choc nie az tak certyfikowanych)
Przydałby się przykład automatycznego wrzucania całych katalogów na serwer i automatycznego sciągania całych katalogów
Dodawanie:
svn add całykatalogŚciąganie:
svn co https://serwer/repo/całykatalogalbo, jeśli mamy już ściągnięte repozytorium, po prostu:
svn updateJak są rozwiązywane konflikty w przypadku plików binarnych?
Podobnie jak w CVS, tyle że SVN sam zgaduje które pliki są binarne i dla nich nie istnieje pojęcie mergowania zmian.
Czyli np. poprawiłem w domu obrazek, który jest w CVS. Czy jak zrobię commit a potem w pracy update to będę miał nowszą wersję obrazka (według daty) czy jakieś posklejane binarne badziewie?
Będziesz miał nowszą wersję.
Co do GUI do Subversion to jest jeszcze:
Qt/KDE:
kdesvn, QSvn, KSvn (z kde-apps.org)
GTK/Gnome:
eccvs (z gnomefiles.org)
Jeśli więc ktoś woli okienka od konsoli to ma wybór.
Przydalaby sie opcja wydruku artykulu:) Pozdrawiam.
CVS tez jest bezpieczny. O bezpieczenstwo dba SSH.
sytuacja taka.
na kompie1 przychodze i sciagam sobie svn co … do katalogu plik test.txt pozniej na kompie2 robie to samo. Na kompie1 edytuje test.txt i daje commit’a na server -zmienia bez problemu- nastepnie na kompie2 edytuje test.txt ( w tym samym czasie co user na kompie1) zapisuje zmiany i daje commita i dostaje cos takiego :
svn: Commit failed (details follow):
svn: Aborting commit: ‘/home/user/svn/user/chello’ remains in conflict
Najpierw robisz update, potem commit. Zawsze.
Subversion na szczęście, w odróżnieniu od CVS nie nadpisze zmian, jeśli damy od razu commit, tylko będzie krzyczał, że jest konflikt.
hej
a moze ktos z was wie jak podczepic pod svn jakis skrypt tak zeby przy kazdym commit z klienta wykonywal mi sie ten skrypt ?
chodzi mi o to zeby przy commit automatycznie ladowal mi pliki strony odrazu do public_html
dzieki za pomoc
naprawde przyjemny tekst - zamierzam zaczac prace z subversion i czegos dokladnie takiego potrzebowalem - krotkiego, konkretnego wstepu zanim zaczne przebijac sie przez dokumentacje - odemnie dzieki :]
Bardzo dobry artykuł. Zanim bym się przebił przez cały book o SVN to by z tydzień minął, a teraz jak już wszystko działa to sobie powoli będę przeglądał dokumentację
Witam,
Mam jedna, mala uwage. Komenda “apache2-ssl-certificate” standardowo generuje certyfikat wazny 30 dni. Przynajmniej tak jest u mnie na KUBUNTU 6.10. Dobrze jest uzywac tej komendy z opcja “-days liczba_dni” - mysle, ze warto dodac ta opcje w tekscie artykulu.
Pozdrawiam
Jacek
Dziękuję za artykuł, bardzo przydatny.
Dodałbym tylko jeszcze informację w punkcie Konfiguracja Subversion, że
polecenie ’svnadmin create faq’ wydajemy będąc w nowoutworzonym katalogu
/home/subversion/public, bo to nie jest tak do końca jasne, a svnadmin
potulnie zrobi katalogi repozytorium, tam gdzie aktualnie się znajduje.
co za beznadziejne howto, takiego dna to dawno nie widzialem.
co jest badziewnego w tym howtu? Sam jestes badziewny tak jak te twoje nigdy niestworzone howtu
Hm nie wiem co zle robie ale po wpisaniu w przegladarce https://*/public/faq i po podaniu loginu i hasla pojawia mi sie : 403 Forbidden You don’t have permission to access /public/faq/ on this server.