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,
  • tagssnapshoty projektu, wersje produkcyjne, kolejne wydania,
  • branchesgałęzie rozwojowe, prace nad kodem.

Instalacja serwera SVN w systemie linux:

Artykuł ten oparty jest na dystrybucji linuxa16.04.6 LTS. Wersja 14.04.6 LTS jest już niewspierananie 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

Your email address will not be published.


*