svn
Handout
svn info
Zeigt Informationen zum Repository an.
svn update
Kopiert aus dem SVN alle Änderungen in das lokale Verzeichnis. Achtung: lokale (eigene) Änderungen werden nicht gemeldet!
svn status -u
Vergleicht Repo mit lokalem Verzeichnis
svn ci [file]
Schreibt die lokalen Änderungen ins SVN
svn 2cl
Aktualisiert das Changelog. Anzeigen mit less ChangeLog. Nützlich um zu sehen was als letztes veraendert wurde.
svn diff
Zeigt Unterschiede zwischen lokalen und entferntem Repository an
svn add
Nimmt ein neues File im SVN auf
svn ps svn:keywords Id
Setzt keyword 'Id', damit die beim Einchecken automatisch aktualisiert wird. Im File muss irgendwo $Id$ angegeben sein
svn log -v | less
Changelog
svn checkout https://systemvcs.math.uzh.ch:8000/sys_svn[/]
Kompletten Tree oder einzelnes Verzeichnis auschecken
svn resolve
If there is a conflict, set the source to be 'resolved'
- Cheat sheet GIT for SVN users
Beschreibung
Subversion (SVN) ist eine Open-Source-Software zur Versionsverwaltung von Dateien und Verzeichnissen.
Installation
Standardgemäss wird svn mittels packaging manager sepp installiert.
Eine sehr umfängliche und technische Dokumentation ist unter http://svnbook.red-bean.com/nightly/en/index.html zu finden.
Date - Store
SVN bietet 2 Möglichkeiten, die Versionierungsdaten zu speichern
- FSFS (Flatfile)
- Berkeley DB
http://svnbook.red-bean.com/nightly/en/svn.reposadmin.planning.html#svn.reposadmin.basics.backends
Da Berkeley DB nur einen Vorteil bringt bei sehr grosser Datenmenge, haben wir uns für FSFS entschieden.
Rechte
SVN kennt verschiedene Arten, die Zugriffe zu steuern.
- Unix - Filegruppen
- Writerfile
Was zu wissen ist, bevor man mit svn arbeitet
Grundsätzliches
Es sollte nie auf dem Repository direkt gearbeitet werden. Das Repository gilt als "Master" für Projektdaten. Zu bearbeitende Daten sollen von dem jeweiligen Benutzer auf ein persönliches Verzeichnis kopiert werden.
Es wird in 3 Arten unterteilt
HINWEIS: Diese drei Ordner (trunk, branches, tags) müssen, sofern gewünscht, bei einem neuen Projekt neu angelegt werden
Trunk
Grundsätzlich wird im Trunk gearbeitet und entwickelt. Trunk wird auch als Head bezeichnet.
Tags
Wenn ein stabiler Status erreicht wird, kann dieser getaggt werden. Das ist im Grunde nichts anderes, als eine Kopie der aktuellen Version. Wenn zum Beispiel eine 1. Version steht, kann man diesen taggen. Im Trunk kann wie gewohnt weitergearbeitet werden. Falls die Version 1 benötigt wird, ist diese im Tag zu finden. Dies geschieht typischerweise, wenn ein Release gemacht wird.
Branch
Ein Projekt kann sich typischerweise aufteilen. Das heisst, dass 2 Gruppen innerhalb des Projektes 2 unterschiedliche Ziele verfolgen. Zum Beispiel macht die eine Gruppe einen Bugfix und die andere Gruppe organisiert das Projekt von Grund auf neu um. In diesem Fall ist es sinnvoll, dass die Bugfix-Gruppe einen Branch vom Projekt erstellt und darauf arbeitet (ebenfalls eine Kopie).
Siehe auch Branch best practice: http://blog.evanweaver.com/articles/2007/08/15/svn-branching-best-practices-in-practice/
http://www.technoids.org/svnmerge.html
Filestruktur
HINWEIS: Auf der selben Ebene wie trunk und branches liegt auch tags {{http://svnbook.red-bean.com/nightly/en/images/ch04dia3.png}}
Lebenswandel eines Projektes
Anwendung
Eine sehr gute Anleitungsseite ist unter http://artis.imag.fr/~Xavier.Decoret/resources/svn/index.html zu finden. Die wichtigsten Anwendungen habe ich zusätzlich dokumentiert.
Ein neues Repository erstellen (Instanz)
svnadmin create --fs-type fsfs /home/user/svn
In einem Repository können beliebig viele Projekte angelegt werden.
Ein neues Projekt erstellen
svn mkdir file:///home/user/svn/myProject -m 'Created myProject'
!!! Hinweis (Trunk, Branches, tags) müssen manuell erstellt werden !!!
svn mkdir file:///home/user/svn/myProject/trunk -m 'Created trunk dir'
svn mkdir file:///home/user/svn/myProject/branches -m 'Created branches dir'
svn mkdir file:///home/user/svn/myProject/tags -m 'Created tags dir'
Check out
svn checkout file:///home/user/svn/myproject
A myproject/trunk
A myproject/trunk
A myproject/trunk/doc
A myproject/trunk/doc/index.html
A myproject/trunk/src
A myproject/trunk/src/main.cpp
A myproject/trunk/src/Makefile
A myproject/trunk/bin
Checked out revision 3.
Vergleichen (diff)
Dieser Tag zeigt die Unterschiede des aktuellen Verzeichnisses und aller Unterverzeichnisse. svn diff --diff-cmd xxdiff-subversion
Commit
svn commit -m 'Use a class to print hello world'
Sämtliche Änderungen ab dem angegebenen Pfad, werden im Repository übernommen.
-m für Message/Änderungskommentar mitgeben
Einen neuen Branch erstellen
http://blog.evanweaver.com/articles/2007/08/15/svn-branching-best-practices-in-practice/http://www.technoids.org/svnmerge.html
Wozu
svn info
Ermitteln der aktuellen Version
svn cp
Kopieren der Quelle in den neuen branch
svn switch
Ändern des aktuellen committing points
Branch/Trunk aktualisieren
http://blog.evanweaver.com/articles/2007/08/15/svn-branching-best-practices-in-practice/http://www.technoids.org/svnmerge.html
FI: Es ist stark zu empfehlen, auf dem persönlichen Workspace zu mergen.
Wozu
svn commit/update
Aktualisiert den Branch im Repository und den lokalen Workspace
svn log
Ermitteln die Änderung seit der Erstellung des Branches
svn info
Ermittelt die aktuelle Head-Version
svn merge Behebt die Differenzen zwischen Trunk und Branch svn status Check for conflicts svn commit Wenn alles ok ist, kann die neue Verison committet werden.
Import (eines Verzeichnisses)
Um ein Verzeichnis in ein Projekt zu importieren, gibt es den import-Kommand.
svn import /path/to/project/ file:///home/user/svn/project/trunk -m 'Initial import'
Loginfos anschauen
Um die Kommentare und Änderungen anzusehen, kann das log-Kommando verwendet werden.
svn log file:///home/user/svn
Ein tag erstellen
Siehe branch erstellen.
Files/Verzeichnis löschen
svn delete file:///home/user/svn/project/trunk/temp -m 'no useful'
Files hinzufuegen
svn add newfile
Version / Timestamp
- Im File muss ein Token vorbereitet werden:
$Id$ - Das Token in SVN aktivieren
svn ps svn:keywords Id <file>
Resolve
- 24.6.19: CR hat das ansible Verzeichnis via
svn updateauf den neuesten Stand gebracht. Anschliessend einige wenige Files bearbeitet und wollte anschliessend einsvn commitmachen. Dabei gab es eine Fehlermeldung:
[crose@tlX]
$ svn commit
svn: E155015: Commit failed (details follow):
svn: E155015: Aborting commit: '/home/a/crose/svn/ansible/trunk/playbooks/roles/thinlinc/server/heartbeat-setup' remains in conflict
# Laut Google kann das mit resolve gelöst werden:
$ svn resolved /home/a/crose/svn/ansible/trunk/playbooks/roles/thinlinc/server/heartbeat-setup
Resolved conflicted state of 'trunk/playbooks/roles/thinlinc/server/heartbeat-setup'
# Anschliessend war ein Commit möglich:
$ svn commit
Sending trunk/hosts
Sending trunk/playbooks/base-system.yml
Deleting trunk/playbooks/roles/thinlinc/server/heartbeat-setup
Transmitting file data ..done
Committing transaction...
Committed revision 4974.
Revert
[daschil@tlX]
$ svn update
$ svn merge -r 150:140 .
$ svn commit -m "Rolled back to r140"