= SVN = <> = Handout = || CMD || Beschreibung || || `svn update` || Kopiert aus dem SVN alle Aenderungen in das lokale Verzeichnis. '''Achtung''': lokale (eigene) Aenderungen werden nicht gemeldet! || || `svn status -u` || Vergleicht Repo mit lokalen Verzeichnis || || `svn ci [file]` || Schreibt die lokalen Aenderungen in's SVN || || `svn 2cl` || Aktualisiert das Changelog. Anzeigen mit `less ChangeLog`. Nuetlzich um zu sehen was als letztes veraendert wurde. || || `svn diff ` || Zeigt Unterschiede zwischen lokalen und entfernen 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 [[http://www.git-tower.com/blog/git-for-subversion-users-cheat-sheet/|GIT for SVN users]] == Beschreibung == Subversion (SVN) ist eine Open-Source-Software zur Versionsverwaltung von Dateien und Verzeichnissen. == Installation == Standartgemä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 kenn verschiedene Arten die Zugriffe zu steuern. * Unix - Filegruppen * Writerfile * LDAP / NIS+ == 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 bearbeiteten Daten sollen von dem jeweiligen Benutzer auf ein persönliches Verzeichnuss === 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'' getagt'' werden. Das ist im Grunde nichts anderes, als eine Kopie der aktuellen Version. Wenn zum Beispiel eine 1 Version steht, kann man diesen''tagen''. Im Trunk kann wie gewohnt weitergearbeiten werden. Falls die Version 1 benötigt wird, ist diese im''Tag''zu finden. Dies geschieht typischerweise, wenn ein Release gemacht wird. An Tags werden nie gearbeitet. Ist dies ein Bedarf, sollte der ''Tag'' den ''Trunk'' bzw. in einen ''Branch'' kopiert werden. ==== Branch ==== Ein Projekt kann sich typischerweise aufteilen. Das heisst, das 2 Gruppen innerhalb des Projektes 2 unterschiedliche Ziele verfolgen. Zum Beispiel macht die eine Gruppe ein Bugfix und 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 Arbeiten (Ebenfalls eine Kopie). Siehe auch Branch best practice: http://blog.evanweaver.com/articles/2007/08/15/svn-branching-best-practices-in-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 ==== . {{http://upload.wikimedia.org/wikipedia/commons/thumb/4/4e/Subversion_project_visualization.svg/800px-Subversion_project_visualization.svg.png}} == Anwendung == Eine sehr gute Anleitungspage 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 alle 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 Massage/Änderungskommentrar mitgeben === Einen neuen Branch erstellen === http://blog.evanweaver.com/articles/2007/08/15/svn-branching-best-practices-in-practice/[[http://blog.evanweaver.com/articles/2007/08/15/svn-branching-best-practices-in-practice/|http://www.technoids.org/svnmerge.html]] ||'''Kommando'''<
> ||'''Wozu'''<
> || ||svn info<
> ||Ermitteln der aktuelle 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://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. ||'''Kommando'''<
> ||'''Wozu'''<
> || ||svn commit/update<
> ||Aktualisiert den Branch im Repository und den lokalen Workspace<
> || ||svn log<
> ||Ermitteln der Änderungerungen 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 commitet werden. || === Import (eines Verzeichnisses) === Um ein Verzeichnis in ein Projet 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 }}} === Resolve === * 24.6.19: CR hat das ansible Verzeichnis via `svn update` auf den neuesten Stand gebracht. Anschliessend einige wenige Files bearbeitet und wollte anschliessend ein `svn commit` machen. 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 geloest 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 moeglich: $ 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. }}}