Versionsverwaltung mit Subversion (SVN)
Alle am Lehrstuhl entwickelten Programme und Ausarbeitungen (Abschlussarbeiten, Seminararbeiten usw.) werden versioniert, d.h. serverseitig mit wiederherstellbaren Zwischenständen und Beschreibungen archiviert. Dies bezeichnet man als Versionsverwaltung (engl. repository), auch bekannt als Konfigurationsmanagement.
Bei uns kommt dabei neben Git auch Subversion (abgekürzt SVN) zum Einsatz. Für das gemeinsame Code-Repository der Gruppe bestehen gesonderte SVN-Regeln, die unbedingt einzuhalten sind. Das Anlegen und Verwalten der Repositories übernehmen Mitarbeiter des Lehrstuhls (z.B. bei Abschlussarbeiten der Betreuer), die interne Anleitung dazu befindet sich unter sdqinternal:Repository-Server.
Siehe auch Wikipedia-Artikel und Subversion FAQ
Ansprechpartner bei Fragen, die der Betreuer nicht beantworten kann, ist der SVN-Verantwortliche (zur Zeit Erik Burger).
Allgemeines
Es ist zu beachten, dass nur Dateien von allgemeinem Interesse in der Verwaltung zu speichern sind. Dazu gehören
- projektbezogene Dateien (Java: .classpath, .project, *.java; nicht aber *.class; .NET: *.sln, *.csproj, *.nunit, *.ndoc, etc.), v.a. die Quelldateien (der gesamte Inhalt des Verzeichnisses src)
- alle verwendeten Bibliotheken (Java/.NET: Verzeichnis lib)
- Quelldateien der Projektdokumentation (also nicht die HTML-Ausgabe von Javadoc u.ä.)
Nicht ins Repository gehören benutzerbezogene Dateien (.NET: *.csproj.user, *.suo) und die Ergebnisse der Kompilierung, also die Verzeichnisse obj und bin.
Zugriff
Benutzername und Passwörter werden vom jeweiligen betreuenden Mitarbeiter bzw. dem SVN-Verantwortlichen erzeugt; ein Account bei der ATIS ist für die Nutzung des SVN-Servers nicht notwendig, jedoch praktisch, da man sich mit den ATIS-Daten anmelden kann und sich somit ein Passwort weniger merken muss, wenn man ein ATIS-Konto hat.
Unter Windows können grafische Clients wie TortoiseSVN, unter Eclipse Plug-Ins wie Subclipse oder Subversive verwendet werden (siehe Clients). Die URLs sehen dabei wie folgt aus: https://svnserver.informatik.kit.edu/i43/svn/myrepository/
(für Studenten bspw. https://svnserver.informatik.kit.edu/i43/svn/stud/MaxMuster).
Manchmal passiert es, dass man bei einem (Unter-)Repository, für das man bis dahin erfolgreich Lese- und Schreibrechte hatte, nur noch updaten aber nicht mehr commiten kann: beim commit kommt die Meldung der Art "Server sent unexpected return value (403 Forbidden) in response to CHECKOUT request for '/i43/svn/stud/!svn/ver/22222/MaxMustermann/Subdirectory'". Das bedeutet, dass man nur noch Lese- und nicht mehr Schreibrechte hat. Vermutlich ist das ein Bug der folgenden Art: wir man (z.B. vom SVN-Admin) zu einer SVN-Gruppe hinzugefügt, verliert man u.U. Schreibzugriff auf Repositories. Lösung: in die browserbasierte Verwaltungsschnittstelle gehen und dort die Schreibrechte wieder vergeben. Hat man selbst nicht genug Rechte dazu, muss man den SVN-Administrator kontaktieren (bei Studenten der Betreuer; bei Mitarbeitern den SVN-Verantwortlichen).
Clients
Ein umfassender Vergleich findet sich auf Wikipedia hier, im einzelnen empfehlen wir
- Eclipse-Plugins:
- Subversive (empfohlen)
- Subclipse (veraltet): http://subclipse.tigris.org
- Windows:
- Tortoise SVN (ein kurzes Tutorial findet sich als PDF-Datei hier)
- Linux:
Struktur des SVN-Repositorys
Achtung:
- einige Repositories sind aus Sicherheitsgründen nicht genannt, bei Bedarf den SVN-Verantwortlichen fragen oder auf der internen Wiki-Seite nachschauen
- das Anlegen eines Repositories mit entsprechenden Benutzern steht im entsprechenden internen Wiki-Artikel.
/code/
(SVN Code Repository): Implementierungen, die für alle relevant sind (nur Mitarbeiter)./palladio_bib/
/trunk/
/sdq_publications.bib
: Publikationen von SDQ (auch ehemalige)/palladio.bib
(referenzierte Arbeiten anderer Forscher)
/paper/
: Von der Palladio-Gruppe verfasste Artikel (nur Mitarbeiter)./<Jahr>/
/<Paper-Titel>/
Form des Papertitels: <Erstautor>_<Konferenzabkürzung_ohne_Jahresangabe>, z.B.Becker_QoSA
- Falls der Erstautor nicht Mitglied der Gruppe ist, optional nächsten Autor aus der Gruppe ergänzen, z.B. CaspartKoziolek_CHEP.
/presentations
/stud/<name>
: Verzeichnis für Student <name>/theses/
: Verzeichnis für Endfassungen von Proposals und Ausarbeitungen (Abschlussarbeiten, Dissertationen)/theses/Abschlussarbeiten/
: Verzeichnis für Proposals und Ausarbeitungen von Abschlussarbeiten (für Studenten zugreifbar)
Tipps und Tricks
Änderungen rückgängig machen
Mit TortoiseSVN unter Windows
- Sei X die alte Version (zu der zurückgekehrt werden soll), und Y die aktuelle (HEAD) Version
- Im Kontext-Menü (im Windows Explorer ) des zurückzurollenden Verzeichnisses/Datei "Show log" bzw. "Log anzeigen" wählen
- Im Log-Browser im Kontext-Menü der Version X "Revert to" auswählen
- Achtung: keinesfalls schon direkt im Kontextmenü (im Windows Explorer) "Revert to" wählen, sondern erst in den Log-Browser von TortoiseSVN gehen und dort arbeiten!
- Nun wieder zurück im Kontext-Menü (im Windows Explorer) committen, nun ist die Version Y+1 der HEAD
Über die Kommandozeile
svn merge -r HEAD:N https://login@svnserver.informatik.kit.edu/i43/svn/path/to/file
Dieser Befehl setzt die aktuellste Version einer Datei oder eines Verzeichnisses zurück auf die durch N angegebene Revision. Jetzt noch einchecken (committen), das war's ;)
Mit-SVN Versionskonflikten umgehen
Versionskonflikte von Binärdateien (PPT, PDF, Word DOC, Excel XLS, etc.)
Problem: Nach dem Ausführen eines "Update" auf einem SVN Repository werden einzelne Dateien als konfliktiert ("Conflicted") im Update Log angezeigt. In der Zusammenfassung steht "Warning! One or more files are in a conflicted state.":
Bei einem Blick in das Respository über den Explorer erscheint eine Datei (ggf. auch mehrere) in einem Konfliktzustand (gelbes Ausrufezeichen). Für diese Datei existieren nach einem Konflikt zwei weitere Dateien im Verzeichnis des lokalen Repositories:
- Hier im Beispiel ist die Datei 04-UML.ppt in einem Konflikt.
- 04-UML.ppt.r1110: die Datei mit der kleineren Nummer hinter dem "r" ist dabei die eigene Version der Datei.
- 04-UML.ppt.r1117: die Datei mit der höheren Nummer hinter dem "r" ist die neue Version aus dem Repository.
Lösung: Bei Binärdateien (wie Powerpoint, PDF, Worddokument, Exceldokument, usw.) ist eine Problemlösung etwas mühsam: Man muss die Dateien einzeln anschauen. Bei MS-Office ist es teilweise möglich, ein Merge durchzuführen, indem man "Edit Conflicts" wählt. Falls sich dann nicht das Office-Programm mit der Merge-Ansicht öffnet, muß man den manuellen Weg wählen:
- Dateien einzeln öffnen und anschauen was sich verändert hat
- Datei 04-UML.ppt.r1110 in 04-UML.ppt.r1110.ppt in umbenennen (Datei markieren, Taste "F2" drücken; die ursprüngliche Dateiendung (hier .ppt) anhängen)
- Datei 04-UML.ppt.r1117 in 04-UML.ppt.r1117.ppt in umbenennen (wie oben .ppt anhängen)
- Beide Dateien durch Doppelklick im dafür vorgesehenen Verzeichnis öffnen (in diesem Falle mit Powerpoint).
- Herausfinden, was sich in der Datei verändert hat indem die Datei Seite für Seite durchgegegangen wird.
- Einzelne neuere Folien in den Foliensatz 04-UML.ppt kopieren.
- Wenn alle Änderungen in der Datei 04-UML.ppt zusammengeführt wurden, kann der Konflikt als behoben markiert werden ("Resolved..."):
Anschließend muss noch ein "commit" auf dem Verzeichnis ausgeführt werden. Damit wurde der Konflikt erfolgreich bearbeitet.
Änderungen nachträglich in einen Branch verschieben
Scenario: Changes have been made on the trunk that are not stable enough to stay there. Thus, you later decide to move these changes to a branch, in order to continue developing there without affecting the trunk.
Example: Before you introduced your changes, the revision of code/Palladio.StoEx/trunk was 8969. In revisions 9197 and 9202, you introduced some changes. Now you want to get the trunk back to its state before the change, while preserving your changes on a branch in order to continue development.
You have to pay attention how to create the branch, because otherwise future merges back to the trunk will be difficult.
To solve this, you have to first create a branch starting from before your changes. In this case, create a branch from code/Palladio.StoEx/trunk, revision 8969. Then, you need to merge the changes you did on the trunk to that branch. Finally, you can revert the changes on the trunk by reverse merging.
Detailed instructions for TortoiseSVN
- Create a branch starting from the trunk before your change (in the example: revision 8969)
- Open the Repository Browser of your project (example: code/Palladio.StoEx/trunk)
- Open the Log (right click on the project, choose "show log")
- In the Log, right click on the revision that you want to create the branch from (in the example: revision 8969) and choose "create branch/tag from revision".
- Enter the right URL where you want your branch to be located in the "to URL" field. In our example: https://svnserver.informatik.kit.edu/i43/svn/code/branches/VariableCharacterisationUpdate/Palladio.StoEx
- Enter a meaningful log message! Example: "Branch for incomplete variable adaptations: branched from code/Palladio.StoEx/trunk, revision 8969".
- Merge the changes from the trunk to the branch
- Freshly checkout the branch (in our case https://svnserver.informatik.kit.edu/i43/svn/code/branches/VariableCharacterisationUpdate/Palladio.StoEx)
- Right click on the folder and choose Merge
- Choose "Merge a range of revisions"
- Choose the correct URL to merge from (in our example: code/Palladio.StoEx/trunk)
- Click "Show Log" to select the revisions to merge
- Select all revisions whose changes you want to merge (not just the latest!). In our example, check all revisions after 8969 (i.e. 9197 and 9202). You do not need to check the revision from which you created the branch (so do not check 8969 itself in this example).
- You probably do not have to change the options, because your branch is brand-new.
- Click Merge
- After the merge, commit the branch working copy. Again, enter a meaningful message, for example "Merge incomplete variable adaptations: Merging r8970 through r9202 of code\Palladio.StoEx\trunk"
- Remove your changes from the trunk (two possible options to do that below)
- Revert the trunk to the state before your changes (if you want to remove all changes after you started with your changes, in our example all changes after 8969). See below for an alternative
- Go to the working copy of your project trunk (in our case: D:/code/Palladio.StoEx/trunk). Update to make sure that you have the HEAD revision.
- Open the log for the project (in our case: D:/code/Palladio.StoEx/trunk)
- Right click to the revision you want to go back to and choose "Revert to this revision"
- Click "Yes". Now the changes that have been done on the branch after revision 8969 will be reverted by reverse merging them into your working copy.
- Check that there are no conflicts. If there are, you need to abort this and find out what went wrong.
- Commit your working copy and enter a meaningful message. Example: "Remove incomplete variable adaptations: Reverse merging revisions HEAD-8969 of https://svnserver.informatik.kit.edu/i43/svn/code/Palladio.StoEx/trunk into D:\code\Palladio.StoEx, respecting ancestry".
- Alternative: If you only to remove some changes, you need to manually reverse merge a selected set of revisions. To do so, choose merge on your working copy, then select "Reverse merge", and select the revisions whose changes you want to revert. Changes of revisions that you d not select will be kept. This could probably lead to conflicts.
- Revert the trunk to the state before your changes (if you want to remove all changes after you started with your changes, in our example all changes after 8969). See below for an alternative
That's it! Later, when you have continued development on the branch and want to merge back, you can select "Merge" in your trunk working copy, and select all the revisions of your branch except for the first (the one where you created the branch).
Trouble Shooting
- When I try to commit, there is a strange error message with "MKACTIVITY": You might be using an old URL of our SVN server, or the wrong user name. Try relocating (SVN relocate) your working copy to the current URL (i.e. starting with https://svnserver.informatik.kit.edu/i43/svn/). If the relocate does not succeed, or if the commit still does not work, you might not have enough rights to access that folder in the SVN. Ask your advisor or the SVN administrator (see above).
SVN Tutorial
http://artis.imag.fr/~Xavier.Decoret/resources/svn/index.html