Subversion (SVN) ist ein Tool zur zur Versionierung und gemeinsamen Entwicklung von Software.
Für eine detailierte Einführung siehe hier: [svnbook]
Installation
Debian/Ubuntu
Unter den meisten Linux Distributionen ist Subversion bereits installiert. Falls nicht kann man das einfach via Terminal nachholen:
apt-get install subversion
Windows
Mac OS X
Subversion installiert man am einfachsten, indem man die [Apple Developer Tools] von der Apple Website
oder via Appstore runterläd und installiert.
Erfahrungsgemäß kann es vorkommen, das die Version die in den Developer Tools enthalten ist nicht die aktuellste ist.
Die jeweils aktuelle Version kann man dann einfach via [Macports] installieren.
kurz:
- Apple Developer Tools installieren
- Macports installieren
- mit
port install subversion
die aktuelle Version von Subversion installieren
Arbeitskopie anlegen
Üblicherweise beginnt man indem man aus einem bestehenden Repository die aktuelle Version auf den eigenen Computer überträgt.
In dieser lokalen Arbeitskopie bearbeitet man den Code und überträgt die Daten später wieder zurück in das Repository.
Arbeitskopie anlegen:
cd /path/on/your/computer
svn checkout protocol://user@host/remote/path/to/repository/trunk/src
typischer Arbeitsablauf
- lokale Arbeitskopie anlegen (einmalig)
- Arbeitskopie aktualisieren
- Code lokal bearbeiten
- Änderungen überprüfen und auf korrekte Funktion testen
- Fehler korrigieren
- Konflikte beheben
- Änderungen in Repository übertragen
Arbeitskopie aktualisieren
cd /path/to/workingcopy
svn update
Code lokal bearbeiten
Bearbeite den Code mit einem Editor deiner Wahl. Wenn du Dateien hinzufügst, löschst, kopierst oder verschiebst musst du SVN darüber informieren. Das macht
man folgendermaßen:
svn add FOO
Füge die Datei oder den Ordner "FOO" zum repository hinzu. Wenn FOO ein Ordner ist werden automatisch alle Dateien die in dem Ordner sind mit hinzugefügt. Möchte man einen Ordner hinzufügen, ohne dass alle darin enthaltenen Dateien ebenfalls hinzugefügt werden, dann benutzt man zusätzlich die option --depth=empty.
svn delete FOO
Lösche die Datei oder den Ordner FOO aus dem Repository. Dateien werden im lokalen Dateisystem sofort gelöscht, Ordner erst beim nächsten commit.
svn copy FOO BAR
Kopiere die Datei FOO nach BAR. Die datei BAR wird automatisch zum Repository hinzugefügt und SVN speichert intern, dass BAR ursprünglich von der Datei FOO kommt.
svn move FOO BAR
Genauso wie FOO, aber BAR wird automatisch aus dem Repository gelöscht.
svn mkdir FOO
Kombiniert die Befehle mkdir FOO und svn add FOO in einen Befehl.
Änderungen überprüfen und Fehler korrigieren
Nachdem der Code angepasst wurde muss dieser auf korrekte Funktion getestet werden. Je nach Sprache und Entwicklungsparadigma werden hier Unittests o.ä. benutzt.
Erst wenn sich die Änderungen fehlerfrei kompilieren lassen und der Code fehlerfrei läuft können wir den Code in das Repository überführen.
Als nützliches Werkzeug bietet Subversion die Möglichkeit alle geänderten Dateien aufzulisten mit dem Befehl
svn status
Nutzt man die Option -v wird der Status von allen Dateien angezeigt, auch wenn man diese nicht verändert hat.
Mit dem Befehl
svn diff
kann man sich in Menschen lesbarer Form alle Änderungen im Detail anzeigen lassen. Da die Ausgabe hier oft sehr umfangreich ist macht es meistens Sinn den Output in eine Datei umzuleiten mittels
svn diff > patchfile
Sollte man feststellen, das man in einer Datei grobe Fehler gemacht hat oder das man die falsche Datei bearbeitet hat, dann kann man alle Änderungen einer Datei
mittels
svn revert FOO
auf den letzten unveränderten Stand zurücksetzen. Der revert Befehl funktioniert auch wenn man eine Datei fälchlicherweise hinzugefügt oder gelöscht hat.
Konflikte beheben
Wenn man sichergestellt hat, dass alle Änderungen korrekt sind müssen wir erst auf Konflikte mit anderen Benutzern prüfen, bevor wir die Änderungen in das Repository übertragen. Wenn z.B. zwei Benutzer unabhängig voneinander die gleiche Datei bearbeitet haben gibt es einen solchen Konflikt. Wir müssen dann von Hand die Änderungen der beiden Nutzer zusammenführen.
Dazu führen wir als erstes ein update aus:
svn update Updating '.': U INSTALL G README Conflict discovered in 'bar.c'. Select: (p) postpone, (df) diff-full, (e) edit, (mc) mine-conflict, (tc) theirs-conflict, (s) show all options:
Da die Konfliktlösung sehr umfangreich werden kann verweise ich an dieser Stelle auf diesen Artikel: [Resolving Conflicts]
Änderungen in Repository übertragen
Nachdem alle Konflikte behoben wurden können wir unsere Änderungen in das Repository übertragen:
svn commit -m "kurze Beschreibung was geändert wurde und was sonst noch wichtig ist"
Wenn die commit message sehr umfangreich ist, dann ist es oft sinnvoll diese in einer separaten Datei anzulegen. In diesem Fall kann man einfach den Inhalt der Datei direkt an SVN übergeben mittels
svn commit -F logmessage
Tipps
1. kleine Veränderungen
Es ist besser nur kleine Veränderungen (z.B. nur an einer Datei) zu machen und anschließend zu commiten. So verringert man aufwendiges Merging.
2. regelmäßige Updates
Durch regelmäßige Updates verhindert man, dass man auf deralteten Daten arbeitet und durch ggf. bereits gepatchte Fehler weitere Fehler verursacht.
3. Absprache
Auch eine Versionsverwaltung wie SVN hilft nur dann, wenn man sich vorher abspricht. So kann man verhindern, dass mehrere Benutzer an einem Problem arbeiten oder die gleiche Datei editieren.
Es ist auch möglich für einzelne oder mehrere Dateien Locks zu setzen. Wenn ein Benutzer einen Lock setzt, dann kann nur er die Datei im Repository ändern, bis er den Lock aufhebt. Man sollte den Lock Mechanismus aber mit Vorsicht benutzen, da es schnell passieren kann, dass man vergisst den Lock wieder zu entfernen.
4. zusätzliche Tools
Meistens ist es von Vorteil neben dem reinen SVN auch noch andere Tools zu verwenden. So kann man andere Benutzer über Commits und Patches informieren. Hierfür eigenen sich z.B. Mailinglisten, Bugtracker oder ein Wiki.
siehe auch
Versionkontrolle mit GIT