Praca z SVN
Praca z SVN
Obecnie pionierem z zakresu wersjonowania kodu źródłowego jest GIT. Nadal jednak SVN jest wykorzystywany w wielu zespołach IT do kontroli wersji kodu.
Struktura katalogów repozytorium SVN zawiera trzy katalogi: trunk, tags i branches.
- trunk – przechowywany jest aktualny projekt czyli przetestowane zmiany w projekcie,
- tags – snapshoty projektu, wersje produkcyjne, kolejne wydania,
- branches – gałęzie rozwojowe, prace nad kodem.
Instalacja serwera SVN w systemie linux:
Artykuł ten oparty jest na dystrybucji linuxa – 16.04.6 LTS. Wersja 14.04.6 LTS jest już niewspierana – nie polecam w tym przypadku instalować subversion, będzie to bardzo utrudnione…
sudo apt-get install subversion libapache2-mod-svn libapache2-svn libsvn-dev <!--?prettify linenums=true?-->
sudo a2enmod dav dav_svn sudo service apache2 restart
Tworzymy pierwsze repozytorium:
sudo mkdir -p /var/lib/svn
sudo svnadmin create /var/lib/svn/javaleader
sudo chown -R www-data:www-data /var/lib/svn
sudo chmod -R 775 /var/lib/svn
Katalog pomocniczy ze strukturą folderów: branches/tags/trunk:
sudo mkdir ~/test cd ~/test mkdir trunk tags branches
import folderów do repozytorium SVN i pierwszy commit:
sudo svn import ~/test file:///home/svn/javaleader -m 'Initial project directories'
Tworzymy użytkowników repozytorium:
sudo touch /etc/apache2/dav_svn.passw
sudo htpasswd -m /etc/apache2/dav_svn.passwd admin
wynik:
sudo htpasswd -m /etc/apache2/dav_svn.passwd admin New password: Re-type new password: Adding password for user admin
Konfiguracja SVN:
Edycja pliku:
/etc/apache2/mods-enabled/dav_svn.conf
zawartość – wskazujemy m.in. gdzie znajduje się plik z hasłami użytkowników:
<Location /svn> DAV svn SVNParentPath /var/lib/svn AuthType Basic AuthName "Subversion Repository" AuthUserFile /etc/apache2/dav_svn.passwd Require valid-user </Location>
repozytorium dostępne jest teraz po zalogowaniu pod adresem:
http://localhost/svn/javaleader/
Sprawdzenie zainstalowanej wersji SVN:
svn --version
Przykładowy wynik:
svn, version 1.9.3 (r1718519)
Pobranie repozytorium:
svn checkout http://localhost/svn/javaleader --username=admin
wynik:
A javaleader/branches A javaleader/tags A javaleader/trunk Checked out revision 1.
Pierwszy commit:
W katalogu ./trunk tworzymy przykładowy plik:
HelloWorld.java:
public class HelloWorld { public static void main(String[] args) { System.out.println("JavaLeader.pl SVN"); } }
kompilujemy:
./javac HelloWorld.java
uruchamiamy:
java HelloWorld
wynik:
JavaLeader.pl SVN
sprawdzamy status powstałych plików:
svn status
wynik:
? HelloWorld.class ? HelloWorld.java
Dodajemy plik z kodem źródłowym do tzw. change-list:
svn add HelloWorld.java
wynik polecenia svn status:
? HelloWorld.class A HelloWorld.java
zmiany zapisujemy w repozytorium (commit):
svn commit -m "HelloWorld v1"
wynik:
Adding trunk/HelloWorld.java Transmitting file data .done Committing transaction... Committed revision 2.
W przypadku błędu:
svn: E000013: Can't open file '/var/lib/svn/javaleader/db/txn-current-lock': Permission denied
należy dodać odpowiednie uprawnienia:
chmod -R 777 ./var/lib/svn/*
Sprawdźmy logi:
svn log
wynik:
------------------------------------------------------------------------ r1 | root | 2020-01-07 13:10:16 +0100 (Tue, 07 Jan 2020) | 1 line Initial project directories
Zmiany w pliku:
Zmieniamy plik:
public class HelloWorld { public static void main(String[] args) { System.out.println("JavaLeader.pl SVN"); } }
Wynik polecenia svn status:
? HelloWorld.class M HelloWorld.java
co oznacza, że plik został zmodyfikowany! Zmiany można zobaczyć poleceniem:
svn diff
wynik:
Index: HelloWorld.java =================================================================== --- HelloWorld.java (revision 2) +++ HelloWorld.java (working copy) @@ -1,7 +1,7 @@ public class HelloWorld { public static void main(String[] args) { - System.out.println("JavaLeader.pl SVN"); + System.out.println("JavaLeader.pl SVN - mod"); } }
zapis zmian:
svn commit -m "change message"
Aktualizacja repozytorium:
Kiedy repozytorium jest nieaktualne, należy je zaaktualizować. Próba zatwierdzenie zmian na nieaktualnym repozytorium zakończy się błędem:
Sending HelloWorld.java Transmitting file data .svn: E155011: Commit failed (details follow): svn: E155011: File '/root/jrepo/javaleader/trunk/HelloWorld.java' is out of date svn: E170004: File '/trunk/HelloWorld.java' is out of date
aktualizacja:
svn update
lub:
svn up
wynik:
Updating '.': G HelloWorld.java Updated to revision 4
G – scalono zmiany.
Cofanie zmian:
Jeśli zmiany które wprowadziliśmy powodują błąd kompilacji należy je poprawić albo wycofać, służy do tego polecenie:
svn revert HelloWorld.java
wynik:
Reverted 'HelloWorld.java'
wycofanie zmian w katalogu ./trunk:
svn revert -R trunk
Załóżmy, że zmiany które wprowadziliśmy są mniej wydajne niż te które zostały wprowadzone we wcześniejszych rewizjach. W takiej sytuacji należy zrealizować operację reverse merge:
svn merge -r 5:4 HelloWorld.java
-r oznacza numer rewizji.
Konflikt:
Kiedy dwóch developerów wykona zmiany w tej samej linii kodu to mamy sytuację konfliktową. Nie można zapisać swoich zmian do czasu aż repozytorium nie zostanie zaktualizowane. W porównaniu do GITa można wykonać lokalny commit przed aktualizacją repozytorium poleceniem git pull. W przypadku natomiast SVNa nie ma możliwości wykonania commita jeśli nasze zmiany są konfliktowe.
Summary of conflicts: Text conflicts: 1 Conflict discovered in file 'HelloWorld.java'. Select: (p) postpone, (df) show diff, (e) edit file, (m) merge, (mc) my side of conflict, (tc) their side of conflict, (s) show all options:
Opcje:
p – pozostawienie zmian w fazie konfliktu, można samodzielnie rozwiązać konflikt modyfikując pliki, konieczne jest poinformowanie svna, że konflikt rozwiązano:
svn resolve --accept=working README
df – podejrzenie zmian,
e – uruchomienie ulubionego edytora ustawionego przez zmienną środowiskową EDITOR.
mc – rozwiązanie konfliktu w taki sposób, że konfliktowe zmiany innych są odrzucane i zastępowane naszymi, zmiany niekonfliktowe są natomiast scalane,
tc – rozwiązanie konfliktu w taki sposób, że konfliktowe zmiany innych mają wyższy priorytet nad naszymi, zmiany niekonfliktowe są scalane,
s – pokazanie wszystkich zmian,
Tagowanie zmian:
Aby otagować (wypuścić przetestowaną) wersję projektu należy wykonać polecenie:
svn copy --revision=4 trunk/ tags/HelloWorld_release_v1
i zapisać swoje zmiany:
svn commit -m "crated basic tag"
Tworzenie gałęzi (z ang. branches):
nowa gałąź:
svn copy trunk branches/dev
zatwierdzenie zmian:
svn commit -m "new dev branch"
scalenie zmian, w katalogu trunk wykonujemy polecenie:
svn merge ../branches/dev/
tworzenie brancha na podstawie konkretnej rewizji wykonujemy analogicznie za pomocą przełącznika –revision.
Leave a comment