Linux: Subversion (SVN) Server

SUBVERSION (znany jako SVN) – system kontroli wersji na licencji Open Source rozwijany przez Apache Software Fundation. Powstał w 2000 roku przez firmę CollabNet.

potrafi porównywać pliki Worda.
Subversion (znany również jako SVN) – system kontroli wersji, który powstał w celu zastąpienia CVS. Z założenia SVN jest w większości przypadków funkcjonalnie zgodny ze swoim poprzednikiem, z kompatybilności zrezygnowano tam, gdzie było to niezbędne do wprowadzenia nowych rozwiązań. SVN jest wolnym i otwartym oprogramowaniem na licencji Apache.
METODY DOSTĘPU file:/// direct repository access (on local disk)
http:// Access via WebDAV protocol to Subversion-aware Apache 2 web server
https:// Same as http://, but with SSL encryption
svn:// Access via custom protocol to an svnserve server
svn+ssh:// Same as svn://, but through an SSH tunnel

WebDAV (ang. Web-based Distributed Authoring and Versioning) – rozszerzenie protokołu HTTP 1.1 o metody COPY, LOCK, MKCOL, MOVE, PROPPATCH, UNLOCK. Pozwala na zarządzanie i kontrolę wersji plików na serwerze WWW. Implementacja WebDAV na serwerze WWW Apache odbywa się poprzez rozszerzenie mod_dav.

SSH – architektura klient-serwer w której transfer danych jest szyfrowany

Specyfikacja HTTP/1.1 pozwala na jednym adresie IP uruchamiać dowolną ilość serwisów dla różnych domen. Serwer nasłuchuje na wskazanym IP ale informacje o tym jaki serwis wyświetlić, są zależne właśnie od vhostów. Dla każdego serwisu będziesz więc potrzebować odrębnego vhosta.

PLIKI
Subversion do autoryzacji używa dav_svn.

/etc/apache2/dav_svn.passwd – zawiera użytkowników i hasłą do WebDAV SVN
/etc/apache2/dav_svn.acl – ścieżka do pliku z definicją uprawnień dostępu dla użytkowników i grup SVN
/etc/apache2/mods-available/dav_svn.conf – konfiguracja repozytoriów svn, które uzywa pliku /etc/apache2/dav_svn_passwd do autoryzacji

/etc/apache2/ports.conf – nasłuchiwanie Apache na portach
/etc/apache2/sites-available – katalog vhostów zwanych „wirtualkami” – odpowiadają za obsługę konkretnej domeny lub grupy domen
/etc/apache2/sites-available/default – wyświeta stronę domyślną, gdy domena, którą internauta wpisał do przeglądarki, a która kieruje na adres IP serwera, nie ma przyporządkowanej konkretnej virtualki.

INSTALACJA I KONFIGURACJA
Wszystkie polecenia wykonujemy jako root (w Ubuntu dla sudo usera wystarczy komedę poprzedzić słowem sudo i podać hasło, łatwiej jednak zalogować się na roota poprzez sudo -i oraz hasło z konta sudo user)!!!

1. Instalacja pakietów:
Do działania programu będziemy potrzebowali serwer Apache 2, który zapewnia uwierzytelnianie oraz umożliwia przeglądanie zasobów przez interfejs WWW.
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).

apt-get update

apt-get install apache2 // potwierdz T (Tak)
apt-get install libapache2-svn
apt-get install subversion
apt-get install subversion-tools

2. Sprawdź czy mod_dav i mod_dav_svn jest dostępny. Moduł WebDAV dla Apache (‚Web-based Distributed Authoring and Versioning’) – to rozszerzenie protokołu HTTP umożliwia tworzenie, kopiowanie, przenoszenie, i usuwanie źródła i zbiorów na zdalnym serwerze.
a2enmod dav
a2enmod dav_svn

odpowiedź systemu:
Module dav already enabled
Module dav_svn already enabled

3. Tworzymy katalog, w którym znajdować się będą nasze repozytoria SVN.
mkdir /var/svn // komenda mkdir tworzy katalog

4. Nadajemy uprawnienia katalogowi svn. 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.
chown -R www-data:www-data /var/svn // komenda chown zmienia właściciela katalogu/pliku
chmod -R 770 /var/svn // komenda chmod zmienia prawa dostępu dla odpowiedniej grupy właścieciel|grupa|pozostali
// 770 oznacza pozwól na r+w+x (czytaj, zapisz, wykonaj) dla grupy właściciel i grupa, dla pozostałych zabroń wszystko

5. Tworzymy nasze piersze repozytorium testowe o nazwie test:
svnadmin create /var/svn/test
chown -R www-data:www-data /var/svn/test

— aby usunąć repozytorium:
rm -r /var/svn/test // komenda rm -r oznacza usuń katalog test ze wszystkimi podkatalogami i plikami

5. Edytujemy plik dav_svn.conf (komentujemy obsługę SSL)
vim /etc/apache2/mods-available/dav_svn.conf // vim jest edytorem tekstu (insert tryb edycji, Esc tryb komend, :wq oznacza zapisz i wyjdź)

<Location /test> #nazwa musi być taka jak nazwa katalogu docelowego SVNPath
DAV svn #moduł svn_dav
SVNPath /var/svn/test #ścieżka do katalogu repozytorium o nazwie test
AuthType Basic #używamy metody HTTP Basic Authentication
AuthName „Repozytorium” #tekst pojawiający się w okienku logowania do svn
AuthUserFile /etc/apache2/dav_svn.passwd #plik z zaszyfrowanymi hasłami użytkowników SVN
<LimitExcept GET PROPFIND OPTIONS REPORT>
Require valid-user
</LimitExcept>
#SSLRequireSSL #obsługa SSL
</Location>

INFO: Jeżeli Require valid-user będzie w <LimitExcept>…</LimitExcept> to wszyscy użytkownicy będą mógli zobaczyć repozytorium ale tylko określeni będą mogli zapisywać.

6. Restartujemy apache:
/etc/init.d/apache2 restart

Odpowiedź systemu:
Restarting web server: apache2 … waiting .

7. Utwórz konta dla użytkowników SVN (pojawi się monit o hasło użytkownika)

Każdy użytkownik musi być najpierw dodany programem htpasswd, aby móc korzystać z repozytorium SVN.
htpasswd -c /etc/apache2/dav_svn.passwd user1 // parametr -c tworzy plik dav_svn.passwd

htpasswd /etc/apache2/dav_svn.passwd user2 // kolejnych użytkowników tworzymy już bez parametru -c tworzącego plik dav_svn.passwd
htpasswd /etc/apache2/dav_svn.passwd user3

Odpowiedź systemu:
New password: // podajemy hasło
Re-type new password: // powtarzamy hasło
Adding password for user1

— zmiana hasła użytkownika:
htpasswd /etc/apache2/dav_svn.passwd user1

8. Testujemy nasze pierwsze repozytorium test
svn co http://localhost/test // pamiętaj wpisz http://

Obszar uwierzytelniania: <http://localhost:80> Repozytorium
Hasło ‚root’:
Obszar uwierzytelniania: <http://localhost:80> Repozytorium
Użytkownik: user1
Hasło ‚user1’:

odpowiedź systemu:
Pobrano wersję 0.

9. Włączamy obsługę SSL
apt-get install openssl ssl-cert

10. Generate a certificate (pamiętaj, aby wypełnić odpowiednie pola)
http://blog.bestnet.pl/?p=202
openssl req $@ -new -x509 -days 365 -nodes -out /etc/apache2/apache.pem -keyout /etc/apache2/apache.pem

i wpisujemy
Nazwa kraju (2 litery kodu): PL
Nazwa stanu lub prowincji (pełna nazwa): mazowieckie
Nazwa lokalizacji (np. miasto): Warszawa
Nazwa organizacji (np. firma): BESTNET
Nazwa jednostki organizacyjnej (np. sekcja): Nazwa wspólna: bestnet.pl
Adres e-mail: info@bestnet.pl

11. Zmień zezwolenia certyfikatu
chmod 600 /etc/apache2/apache.pem

12. Dodaj nasłuchiwanie na porcie 443 (SSL) do /etc/apache2/ports.conf:
vim /etc/apache2/ports.conf
<IfModule mod_ssl.c>
Listen 443
</IfModule>

13. Plik /etc/apache2/sites-available/default
vim /etc/apache2/sites-available/default

Zmienna <VirtualHost> na <VirtualHost *.80>

i dodaj na końcu pliku po </VirtualHost>

<VirtualHost *.443>
ServerAdmin webmaster@localhost
SSLEngine on
SSLCertificateFile /etc/apache2/apache.pem
</VirtualHost>

14. Odkomentuj SSL wymagane w /etc/apache2/mods-available/dav_svn.conf

<Location /test>
DAV svn // moduł svn_dav
SVNPath /var/svn/test // ścieżka do katalogu repozytorium o nazwie test
AuthType Basic // używamy metody HTTP Basic Authentication
AuthName „Repozytorium” // tekst pojawiający się w okienku logowania do svn
AuthUserFile /etc/apache2/dav_svn.passwd // lokalizacja pliku z zaszyfrowanymi hasłami użytkowników SVN
Require valid-user
SSLRequireSSL // obsługa
</Location>

15. Upewnij się, że moduł ssl jest załadowany
a2enmod ssl

odpowiedź systemu:
Module ssl already enabled

16.Przeładuj konfiguracje Apache
/etc/init.d/apache2 restart

17. Przetestuj połączenie szyfrowane HTTPS używając przeglądarki (jeżeli test przebieg prawidłowo znaczy, że SSL działa)
https://localhost/test // pamiętaj wpisz https://

18. Dodajmy zezwolenia dostępu do SVN dla użytkowników
vim /etc/apache2/dav_svn.authz

Wstawimy do pliku

[groups]
admin = user1,user2,user3
developers = user1,user2,user3

[/]
@admin = rw
@developers = r

[test:/]
@admin = rw
@developers = rw

[/] – repozytorium nadrzędne. Tylko użytkownicy grupy @admin będą mogli dodawać nowe repozytoria.

19. Dodaj to do pliku /etc/apache2/mods-available/dav_svn.conf, by dav_svn.authz kontrolowało dostęp do svn
vim /etc/apache2/mods-available/dav_svn.conf
<Location /test>
DAV svn // moduł svn_dav
SVNPath /var/svn/test // ścieżka do katalogu repozytorium o nazwie test
AuthType Basic // używamy metody HTTP Basic Authentication
AuthName „Repozytorium” // tekst pojawiający się w okienku logowania do svn
AuthUserFile /etc/apache2/dav_svn.passwd // lokalizacja pliku z zaszyfrowanymi hasłami użytkowników SVN
Require valid-user

SSLRequireSSL // obsługa
AuthzSVNAccessFile /etc/apache2/dav_svn.authz // ścieżka do pliku z definicją uprawnień dostępu dla użytkowników i grup SVN
</Location>

20. Przeładuj Apache
/etc/init.d/apache2 restart

21. Sprawdzenie czy działa login i haslo do SVN:
svn list https://localhost/test –username user1 // pamiętaj wpisz https://

— Problemy ———————————————————-

Problem: svn: ‚test’ is already a working copy for a diffrent URL

Rozwiązanie: najczęściej zachowane ustawienia przy zmianie z http na https, usuń w katalogu test katalog .svn, # cd /root/test, sprawdź czy jest katalog .svn komendą # ls -la, usuń zawartość # rm -r .svn

Problem: svn nie pyta o haslo użytkownika

Rozwiązanie: jeżeli już wprowadziłeś login i hasło to, aby pojawił się znowu monit musisz usunąć katalog .subversion # rm -r /root/.subversion

Problem: svn: Serwer wysłał nieoczekiwaną wartość powrotną (405 Method Not Allowed) w odpowiedzi na żądanie PROPFIND dla /test

Rozwiązanie: sprawdź nazwę <Location /test> w pliku /etc/apache2/mods-available/dav_svn.conf a następnie /etc/init.d/apache2 restart

Problem: svn: Serwer wysłał nieoczekiwaną wartość powrotną (403 Forbidden) w odpowiedzi na żądanie OPTIONS dla http://localhost/bestnet

Rozwiązanie: sprawdź

Problem: Pyta o login i haslo ale zwraca komunikat svn: Could not open the requested SVN filesystem

Rozwiązanie: Sprawdź nazwę SVNPath /var/svn/test w pliku /etc/apache2/mods-available/dav_svn.conf a następnie /etc/init.d/apache2 restart
Sprawdź czy ścieżka /var/svn ma prawa 770 i www-data:www-data

Problem: Podczas restartowania apache otrzymujesz komunikat
Restarting web server: apache2[Thu Oct 07 21:48:57 2010] [warn] _default_ VirtualHost overlap on port 443, the first has precedence

… waiting [Thu Oct 07 21:48:58 2010] [warn] _default_ VirtualHost overlap on port 443, the first has precedence

Rozwiązanie: Zahaszuj w pliku /etc/apache2/sites-available/default
vim /etc/apache2/sites-available/default

1. <VirtualHost *.443>
2. ServerAdmin webmaster@localhost
3. SSLEngine on
4. SSLCertificateFile /etc/apache2/apache.pem
5. </VirtualHost>

Problem: sqlite: database disk image is malformed
Rozwiazanie:
1) usuna ukryty katalog .svn
2) klikamy prawym na katalog svn checkout i wyeksportowac bezposrednio do tego katalogu
3) na pytanie „Katalog nie jest pusty. Cz nadpisac?”, Potwierdzic, że TAK

ŹRÓDŁO:
http://www.howtoforge.com/installing-subversion-and-configuring-access-through-different-protocols-on-ubuntu-11.10
http://www.howtoforge.com/how-to-set-up-an-ssl-vhost-under-apache2-on-ubuntu-9.10-debian-lenny
http://jakilinux.org/aplikacje/subversion-dla-kazdego/

Redirect http to https
http://wiki.apache.org/httpd/RedirectSSL

Satisfy Any or Satisfy All
http://wiki.apache.org/httpd/BypassAuthenticationOrAuthorizationRequirements

SVN

BACKUP SVN
Kopia całego repozytorium SVN (dump):

svnadmin dump /var/svn/test > /root/backup/svn/`date +’%d%m%y’`.dump

Kopia ostatniej wersji SVN:

svnadmin dump REPOS_PATH [-r LOWER[:UPPER]] [–incremental]

Options

–deltas–incremental–quiet (-q)–revision (-r) REV

Weryfikujemy czy repozytorium nie zawiera błędów

svnadmin verify /var/svn/test

Sprawdzamy numer Revision na Serwerze

svnadmin verify -r HEAD / myrepo

Sprawdzamy Revision od 100 do 200

svnadmin verify -r100:200 /var/svn/myrepo

Sprawdzamy numer Revision na kopii roboczej
Prawym klawiszem myszki na katalog SVNTortoiseSVN->Show log

Zrzucamy ostatnią wersję SVN:

svnadmin dump -r100-200 svn.dump
tar -czf svn.tar.gz svn.dump

Kasowanie historii od Revision 0 do 9000.

# svnadmin dump /path_current/svn/repo -r9000:10000 > svn.dump# svnadmin create /path_new/svn/repo# svnadmin load /path_new/svn/repo < svn.dump

Problem: svn nie pyta o haslo użytkownika

Rozwiązanie: jeżeli już wprowadziłeœ login i hasło to, aby pojawił się znowu monit musisz usunąć katalog .subversion # rm -r /root/.subversion

Problem: svn: Serwer wysłał nieoczekiwaną wartoœć powrotną (405 Method Not Allowed) w odpowiedzi na żądanie PROPFIND dla /test

Rozwiązanie: sprawdź nazwęw pliku /etc/apache2/mods-available/dav_svn.conf a następnie /etc/init.d/apache2 restart

Problem: svn: Serwer wysłał nieoczekiwaną wartoœć powrotną (403 Forbidden) w odpowiedzi na żądanie OPTIONS dla http://localhost/bestnet

Rozwiązanie:

Problem: DATABASE DISK IMAGE MALFORMED

Rozwiązanie:
1) Możliwe uszkodzenie samej bazy danych na dysku lokalnym

2) Możliwe uszkodzenie na serverze
a) Once you see the „Database disk image malformed” error, your database is broken and cannot be fully repaired. See e.g. http://www.sqlite.org/faq.html#q21

b) If you were using SQLite directly, you could recover *some* data (some tables) from such broken database (using SQLite database dump and load commands). In your case that is unacceptable, because subversion cannot use partial data. Full database recovery is still not possible.

Thus the only way is to create a new subversion repository and restore it from your backups.

Even if you do not have backups, I think that the current repository is still readable. You can try to create a copy of it, using svnadmin dump + load, or svnsync. See the SVN Book for details.

źródło: http://readlist.com/lists/subversion.tigris.org/users/10/51087.html

Problem: Pyta o login i haslo ale zwraca komunikat svn: Could not open the requested SVN filesystem

Rozwiązanie: Sprawdź nazwę SVNPath /var/svn/test w pliku /etc/apache2/mods-available/dav_svn.conf a następnie /etc/init.d/apache2 restart

Problem: Cleanup failed to process the following paths: -C:\Project\Published Your .svn/tmp directory may be missing or corrupt; run ‚svn cleanup’ and try again Can’t open file ‚C:\Project\Published\.svn\tmp\entries’: The system cannot find the path specified
Rozwiązanie:
1) Usuń plik/katalog z błędem i zrób ponownie Update
2) Spróbuj wykonać Clean up
3) Usuń z głównego katalogu .svn, zrób checkout (główna ścieżka, główny katalog np. domena.pl/yoursvn, d:\server), potwierdź YES (zacznie się wersjonowanie plików i dodawanie brakujących katalogów/plików)

Problem: Podczas restartowania apache otrzymujesz komunikat
Restarting web server: apache2[Thu Oct 07 21:48:57 2010] [warn] _default_ VirtualHost overlap on port 443, the first has precedence

… waiting [Thu Oct 07 21:48:58 2010] [warn] _default_ VirtualHost overlap on port 443, the first has precedence

Rozwiązanie: Zahaszuj w pliku /etc/apache2/sites-available/default
vim /etc/apache2/sites-available/default
ServerAdmin webmaster@localhost
SSLEngine on
SSLCertificateFile /etc/apache2/apache.pem

Zarządzanie svn na komputerze lokalnym

1) Œciągnij i zainstaluj najnowszą wersję svn (wybierz odpowiednią wersję dla Twojego systemu 32 lub 64 bitową) oraz paczkę z językiem -> http://tortoisesvn.net/downloads
2) tworzymy katalog na komputerze lokalnym o dowolnej nazwie np. Server
3) klikamy prawy przycisk myszy na katalog Server i dalej TortoiseSVN -> Repo-browser -> wpisujemy svn+ssh://user@host/svn_directory
4) akceptujemy na stałe certfikat, podajemy login i hasło
5) prawy przycisk myszy -> Create folder -> trunk

prawy przycisk myszy -> Create folder -> releases

6) pobieranie zawartoœći z servera do katalogu ekomis na komputerze lokalnym

prawy przycisk myszy na katalog bestnet -> wybieramy SVN Checkout…

Informacje dodatkowe:
SVN Update – służy do pobierania zawartoœci z serwera (download)
SVN Commit… – służy do wrzucania zawartoœci na serwer (upload)

TortoiseSVN: – Show log -> pokazuje wszystkie logi (wersje repozytorium)

– Update to revision -> wpisujesz nr revision, do którego chcesz się cofnąć

Potrzebne programy:
tortoiseSVN -> http://tortoisesvn.net/downloads
nakładka polska na tortoiseSVN -> http://tortoisesvn.net/downloads
PuTTY -> http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html

Potrzebne pliki:
private_key.ppk -> sprawdŸ jak wygenerować plik private_key.ppk

Nakładka językowa na TortoiseSVN.
Step 1) Zainstaluj nakładkę językową do programu TortoiseSVN:
– kliknij Next
– kliknij Finish

Step 3) Zmiana języka
– kliknij pkm na wolny obszar pulpitu
– wybierz TortoiseSVN -> Ustawienia
– Language -> wybierz z listy swój język
– kliknij OK

4) Ustawienie klucza i sesji w Putty dla TortoiseSVN
– zaznacz putty.exe i privat_key.ppk
– prawy klawisz myszy Kopiuj
– wejdŸ do katalogu C:\Program Files\
– prawy klawisz myszy Nowy->Folder
– wpisz Putty
– prawy klawisz myszy na katalog Putty klknij Wklej
– wejdŸ do katalogu Putty

5) Konfiguracja aplikacji putty
– uruchom putty.exe
– Connection

– Data- Auto-login username: user- SSH- Auth- Privare key file for authentication: Browse (wybieramy private_key.ppk)

– Session

– Host Name (or IP address): example.com- Port: 22- Connection Type: SSH- Saved Sessions: example

– naciœnij przycisk Save
– naciœnij Cancel

6) Tworzymy katalog Backup i konfigurujemy Tortoise
– prawy klawisz myszy Nowy->Folder
– wpisujemy Backup
– prawy klawisz myszy SVN Pobierz
– Adres URL repozytorium: svn+ssh://example/svn_directory
– klikamy OK
– Store key in cash: Tak

7) Obsługa SVN
SVN Update – służy do pobierania zawartoœci z serwera (Uaktualnij)
SVN Commit… – służy do wrzucania zawartoœci na serwer (ZatwierdŸ zmiany)
SVN Show logs – pokaż wszystkie zmiany w katalogu/pliku
POPRZEDNIA WERSJA MA BYĆ AKTUALNĄ
kliknij prawym myszki na katalog lub plik -> TortoiseSVN -> Merge -> wybierz opcję “Merge two different trees” -> w sekcji To: wpisz wcześniejszą rewizję lub kliknij Show log, by wybrać z listy -> Dalej -> Testuj merge -> jeżeli wszystko przebiegło prawidłowo naciśnij Merge

TortoiseSVN: Show log -> pokazuje wszystkie logi (wersje repozytorium)

Update to revision -> wpisz nr, do którego chcesz się cofnąć

PODSTAWY UŻYTKOWANIA: To move a file or set of files using tortoise, right-click-and-drag the target files to their destination and release the right mouse button. The popup menu will have a ‚SVN move versioned files here’ option. Note that the destination folder must have already been added to the repository for the ‚SVN move versioned files here’ option to appear.

REPO BROWSER http://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-dug-repobrowser.html
I you need to work directly on the repository, without having a working copy. Just as the explorer and the icon overlays allow you to view your working copy, so the Repository Browser allows you to view the structure and status of the repository.