<?xml version="1.0" encoding="utf-8"?><!DOCTYPE article  PUBLIC '-//OASIS//DTD DocBook XML V4.4//EN'  'http://www.docbook.org/xml/4.4/docbookx.dtd'><article><articleinfo><title>svn</title><revhistory><revision><revnumber>24</revnumber><date>2025-08-08 12:43:59</date><authorinitials>kputyr</authorinitials></revision><revision><revnumber>23</revnumber><date>2021-02-08 07:53:35</date><authorinitials>eseide</authorinitials></revision><revision><revnumber>22</revnumber><date>2021-02-08 07:49:54</date><authorinitials>eseide</authorinitials></revision><revision><revnumber>21</revnumber><date>2021-02-08 07:36:06</date><authorinitials>eseide</authorinitials></revision><revision><revnumber>20</revnumber><date>2020-06-17 15:59:21</date><authorinitials>daschil</authorinitials></revision><revision><revnumber>19</revnumber><date>2020-06-17 15:59:11</date><authorinitials>daschil</authorinitials></revision><revision><revnumber>18</revnumber><date>2020-06-17 15:58:53</date><authorinitials>daschil</authorinitials></revision><revision><revnumber>17</revnumber><date>2019-06-24 13:30:57</date><authorinitials>crose</authorinitials></revision><revision><revnumber>16</revnumber><date>2019-06-24 13:30:41</date><authorinitials>crose</authorinitials></revision><revision><revnumber>15</revnumber><date>2016-10-24 09:27:28</date><authorinitials>crose</authorinitials></revision><revision><revnumber>14</revnumber><date>2015-02-04 09:44:24</date><authorinitials>crose</authorinitials></revision><revision><revnumber>13</revnumber><date>2015-02-04 09:43:56</date><authorinitials>crose</authorinitials></revision><revision><revnumber>12</revnumber><date>2015-02-04 09:43:37</date><authorinitials>crose</authorinitials></revision><revision><revnumber>11</revnumber><date>2015-02-04 09:43:13</date><authorinitials>crose</authorinitials></revision><revision><revnumber>10</revnumber><date>2015-02-04 09:42:56</date><authorinitials>crose</authorinitials></revision><revision><revnumber>9</revnumber><date>2015-02-04 09:23:46</date><authorinitials>crose</authorinitials></revision><revision><revnumber>8</revnumber><date>2014-11-25 13:15:19</date><authorinitials>crose</authorinitials></revision><revision><revnumber>7</revnumber><date>2014-11-23 16:53:06</date><authorinitials>crose</authorinitials></revision><revision><revnumber>6</revnumber><date>2014-11-23 15:57:09</date><authorinitials>crose</authorinitials></revision><revision><revnumber>5</revnumber><date>2014-11-23 15:56:37</date><authorinitials>crose</authorinitials></revision><revision><revnumber>4</revnumber><date>2014-04-25 09:29:30</date><authorinitials>crose</authorinitials></revision><revision><revnumber>3</revnumber><date>2014-04-25 09:29:11</date><authorinitials>crose</authorinitials></revision><revision><revnumber>2</revnumber><date>2014-04-25 09:26:53</date><authorinitials>crose</authorinitials></revision><revision><revnumber>1</revnumber><date>2009-07-06 11:50:17</date><authorinitials>crose</authorinitials></revision></revhistory></articleinfo><section><title>SVN</title></section><section><title>Handout</title><informaltable><tgroup cols="2"><colspec colname="col_0"/><colspec colname="col_1"/><tbody><row rowsep="1"><entry colsep="1" rowsep="1"><para> CMD </para></entry><entry colsep="1" rowsep="1"><para> Beschreibung </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para> <code>svn info</code>   </para></entry><entry colsep="1" rowsep="1"><para> Zeigt Informationen zum Repository an. </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para> <code>svn update</code> </para></entry><entry colsep="1" rowsep="1"><para> Kopiert aus dem SVN alle Änderungen in das lokale Verzeichnis. <emphasis role="strong">Achtung</emphasis>: lokale (eigene) Änderungen werden nicht gemeldet! </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para> <code>svn status -u</code> </para></entry><entry colsep="1" rowsep="1"><para> Vergleicht Repo mit lokalem Verzeichnis </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para> <code>svn ci [file]</code> </para></entry><entry colsep="1" rowsep="1"><para> Schreibt die lokalen Änderungen ins SVN </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para> <code>svn 2cl</code> </para></entry><entry colsep="1" rowsep="1"><para> Aktualisiert das Changelog. Anzeigen mit <code>less ChangeLog</code>. Nützlich um zu sehen was als letztes veraendert wurde. </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para> <code>svn diff &lt;file&gt;</code> </para></entry><entry colsep="1" rowsep="1"><para> Zeigt Unterschiede zwischen lokalen und entferntem Repository an </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para> <code>svn add &lt;file&gt;</code> </para></entry><entry colsep="1" rowsep="1"><para> Nimmt ein neues File im SVN auf </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para> <code>svn ps svn:keywords Id &lt;file&gt;</code> </para></entry><entry colsep="1" rowsep="1"><para> Setzt keyword 'Id', damit die beim Einchecken automatisch aktualisiert wird. Im File muss irgendwo <code>$Id$</code> angegeben sein </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para> <code>svn log -v</code> | less  </para></entry><entry colsep="1" rowsep="1"><para> Changelog </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para> <code>svn checkout https://systemvcs.math.uzh.ch:8000/sys_svn[/&lt;path&gt;]</code> </para></entry><entry colsep="1" rowsep="1"><para> Kompletten Tree oder einzelnes Verzeichnis auschecken </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para> <code>svn resolve &lt;file/directory&gt;</code> </para></entry><entry colsep="1" rowsep="1"><para> If there is a conflict, set the source to be 'resolved' </para></entry></row></tbody></tgroup></informaltable><itemizedlist><listitem><para>Cheat sheet <ulink url="http://www.git-tower.com/blog/git-for-subversion-users-cheat-sheet/">GIT for SVN users</ulink> </para></listitem></itemizedlist><section><title>Beschreibung</title><para>Subversion (SVN) ist eine Open-Source-Software zur Versionsverwaltung von Dateien und Verzeichnissen. </para></section><section><title>Installation</title><para>Standardgemäss wird svn mittels packaging manager <ulink url="https://wiki.math.uzh.ch/public/svn/public/sepp#">sepp</ulink> installiert. </para><para>Eine sehr umfängliche und technische Dokumentation ist unter <ulink url="http://svnbook.red-bean.com/nightly/en/index.html"/> zu finden. </para><section><title>Date - Store</title><para>SVN bietet 2 Möglichkeiten, die Versionierungsdaten zu speichern </para><itemizedlist><listitem><para>FSFS (Flatfile) </para></listitem><listitem><para>Berkeley DB </para></listitem></itemizedlist><para><ulink url="http://svnbook.red-bean.com/nightly/en/svn.reposadmin.planning.html#svn.reposadmin.basics.backends"/> </para><para>Da Berkeley DB nur einen Vorteil bringt bei sehr grosser Datenmenge, haben wir uns für FSFS entschieden. </para></section><section><title>Rechte</title><para>SVN kennt verschiedene Arten, die Zugriffe zu steuern. </para><itemizedlist><listitem><para>Unix - Filegruppen </para><itemizedlist><listitem><para>Writerfile </para></listitem></itemizedlist></listitem><listitem><para>LDAP / NIS+ </para></listitem></itemizedlist></section></section><section><title>Was zu wissen ist, bevor man mit svn arbeitet</title><section><title>Grundsätzliches</title><para>Es sollte nie auf dem Repository direkt gearbeitet werden. Das Repository gilt als &quot;Master&quot; für Projektdaten. Zu bearbeitende Daten sollen von dem jeweiligen Benutzer auf ein persönliches Verzeichnis kopiert werden. </para></section><section><title>Es wird in 3 Arten unterteilt</title><para>HINWEIS: Diese drei Ordner (trunk, branches, tags) müssen, sofern gewünscht, bei einem neuen Projekt neu angelegt werden </para><section><title>Trunk</title><para>Grundsätzlich wird im Trunk gearbeitet und entwickelt. Trunk wird auch als Head bezeichnet. </para></section><section><title>Tags</title><para>Wenn ein stabiler Status erreicht wird, kann dieser <emphasis>getaggt</emphasis> werden. Das ist im Grunde nichts anderes, als eine Kopie der aktuellen Version. Wenn zum Beispiel eine 1. Version steht, kann man diesen <emphasis>taggen</emphasis>. Im Trunk kann wie gewohnt weitergearbeitet werden. Falls die Version 1 benötigt wird, ist diese im <emphasis>Tag</emphasis> zu finden. Dies geschieht typischerweise, wenn ein Release gemacht wird. </para><para>An Tags werden nie gearbeitet. Ist dies ein Bedarf, sollte der <emphasis>Tag</emphasis> den <emphasis>Trunk</emphasis> bzw. in einen <emphasis>Branch</emphasis> kopiert werden. </para></section><section><title>Branch</title><para>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). </para><para>Siehe auch Branch best practice: <ulink url="http://blog.evanweaver.com/articles/2007/08/15/svn-branching-best-practices-in-practice/"/> </para><para><ulink url="http://blog.evanweaver.com/articles/2007/08/15/svn-branching-best-practices-in-practice/">http://www.technoids.org/svnmerge.html</ulink> </para></section><section><title>Filestruktur</title><para>HINWEIS: Auf der selben Ebene wie trunk und branches liegt auch <emphasis><emphasis role="strong">tags</emphasis></emphasis> <inlinemediaobject><imageobject><imagedata fileref="http://svnbook.red-bean.com/nightly/en/images/ch04dia3.png"/></imageobject><textobject><phrase>http://svnbook.red-bean.com/nightly/en/images/ch04dia3.png</phrase></textobject></inlinemediaobject> </para></section><section><title>Lebenswandel eines Projektes</title><itemizedlist><listitem override="none"><para><inlinemediaobject><imageobject><imagedata fileref="http://upload.wikimedia.org/wikipedia/commons/thumb/4/4e/Subversion_project_visualization.svg/800px-Subversion_project_visualization.svg.png"/></imageobject><textobject><phrase>http://upload.wikimedia.org/wikipedia/commons/thumb/4/4e/Subversion_project_visualization.svg/800px-Subversion_project_visualization.svg.png</phrase></textobject></inlinemediaobject> </para></listitem></itemizedlist></section></section></section><section><title>Anwendung</title><para>Eine sehr gute Anleitungsseite ist unter <ulink url="http://artis.imag.fr/~Xavier.Decoret/resources/svn/index.html"/> zu finden. Die wichtigsten Anwendungen habe ich zusätzlich dokumentiert. </para><section><title>Ein neues Repository erstellen (Instanz)</title><screen><![CDATA[svnadmin create --fs-type fsfs /home/user/svn]]></screen><para>In einem Repository können beliebig viele Projekte angelegt werden. </para></section><section><title>Ein neues Projekt erstellen</title><screen><![CDATA[svn mkdir file:///home/user/svn/myProject -m 'Created myProject']]></screen><para>!!! Hinweis (Trunk, Branches, tags) müssen manuell erstellt werden !!! </para><screen><![CDATA[svn mkdir file:///home/user/svn/myProject/trunk -m 'Created trunk dir']]></screen><screen><![CDATA[svn mkdir file:///home/user/svn/myProject/branches -m 'Created branches dir']]></screen><screen><![CDATA[svn mkdir file:///home/user/svn/myProject/tags -m 'Created tags dir']]></screen></section><section><title>Check out</title><screen><![CDATA[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
]]><![CDATA[
Checked out revision 3.]]></screen></section><section><title>Vergleichen (diff)</title><para>Dieser <emphasis><emphasis role="strong">Tag</emphasis></emphasis> zeigt die Unterschiede des aktuellen Verzeichnisses und aller Unterverzeichnisse. <code>svn diff --diff-cmd xxdiff-subversion</code> </para></section><section><title>Commit</title><screen><![CDATA[svn commit -m 'Use a class to print hello world']]></screen><para>Sämtliche Änderungen ab dem angegebenen Pfad, werden im Repository übernommen. </para><para>-m für Message/Änderungskommentar mitgeben </para></section><section><title>Einen neuen Branch erstellen</title><para><ulink url="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"/>]] </para><informaltable><tgroup cols="2"><colspec colname="col_0"/><colspec colname="col_1"/><tbody><row rowsep="1"><entry colsep="1" rowsep="1"><para><emphasis role="strong">Kommando</emphasis></para></entry><entry colsep="1" rowsep="1"><para><emphasis role="strong">Wozu</emphasis></para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>svn info</para></entry><entry colsep="1" rowsep="1"><para>Ermitteln der aktuellen Version</para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>svn cp</para></entry><entry colsep="1" rowsep="1"><para>Kopieren der Quelle in den neuen branch</para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>svn switch</para></entry><entry colsep="1" rowsep="1"><para>Ändern des aktuellen committing points</para></entry></row></tbody></tgroup></informaltable></section><section><title>Branch/Trunk aktualisieren</title><para><ulink url="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"/>]] </para><para>FI: Es ist stark zu empfehlen, auf dem persönlichen Workspace zu mergen. </para><informaltable><tgroup cols="2"><colspec colname="col_0"/><colspec colname="col_1"/><tbody><row rowsep="1"><entry colsep="1" rowsep="1"><para><emphasis role="strong">Kommando</emphasis></para></entry><entry colsep="1" rowsep="1"><para><emphasis role="strong">Wozu</emphasis></para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>svn commit/update</para></entry><entry colsep="1" rowsep="1"><para>Aktualisiert den Branch im Repository und den lokalen Workspace</para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>svn log</para></entry><entry colsep="1" rowsep="1"><para>Ermitteln die Änderung seit der Erstellung des Branches</para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para>svn info</para></entry><entry colsep="1" rowsep="1"><para>Ermittelt die aktuelle Head-Version</para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1" valign="top"><para>svn merge </para></entry><entry colsep="1" rowsep="1" valign="top"><para>Behebt die Differenzen zwischen Trunk und Branch </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1" valign="top"><para>svn status </para></entry><entry colsep="1" rowsep="1" valign="top"><para>Check for conflicts </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1" valign="top"><para>svn commit </para></entry><entry colsep="1" rowsep="1" valign="top"><para>Wenn alles ok ist, kann die neue Verison committet werden. </para></entry></row></tbody></tgroup></informaltable></section><section><title>Import (eines Verzeichnisses)</title><para>Um ein Verzeichnis in ein Projekt zu importieren, gibt es den import-Kommand. </para><screen><![CDATA[svn import /path/to/project/ file:///home/user/svn/project/trunk -m 'Initial import']]></screen></section><section><title>Loginfos anschauen</title><para>Um die Kommentare und Änderungen anzusehen, kann das log-Kommando verwendet werden. </para><screen><![CDATA[svn log file:///home/user/svn]]></screen></section><section><title>Ein tag erstellen</title><para>Siehe branch erstellen. </para></section><section><title>Files/Verzeichnis löschen</title><screen><![CDATA[svn delete file:///home/user/svn/project/trunk/temp -m 'no useful']]></screen></section><section><title>Files hinzufuegen</title><screen><![CDATA[svn add newfile]]></screen></section><section><title>Version / Timestamp</title><itemizedlist><listitem><para>Im File muss ein Token vorbereitet werden: <code>$Id$</code> </para></listitem><listitem><para>Das Token in SVN aktivieren </para></listitem></itemizedlist><screen><![CDATA[svn ps svn:keywords Id <file>]]></screen></section><section><title>Resolve</title><itemizedlist><listitem><para>24.6.19: CR hat das ansible Verzeichnis via <code>svn update</code> auf den neuesten Stand gebracht. Anschliessend einige wenige Files bearbeitet und wollte anschliessend ein <code>svn commit</code> machen. Dabei gab es eine Fehlermeldung: </para></listitem></itemizedlist><screen><![CDATA[[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
]]><![CDATA[
# 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'
]]><![CDATA[
# 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.]]></screen></section><section><title>Revert</title><para><ulink url="https://stackoverflow.com/questions/814433/how-do-i-return-to-an-older-version-of-our-code-in-subversion"/> </para><screen><![CDATA[[daschil@tlX]
$ svn update
$ svn merge -r 150:140 .
$ svn commit -m "Rolled back to r140"]]></screen></section></section></section></article>