Main /

Subversion Benutzen

Subversion Benutzen

/ HomePage / Computer / Software / Programmierung / EntwicklerTools / SubversionBenutzen

Kurzanleitung zur Versionsverwaltung Subversion

Subversion installieren gibt es hier.

Warum Subversion?

Subversion ist eine Versionsverwaltung ähnlich CVS. Genauer gesagt ist es ein Nachfolger, den einige Leute geschrieben haben weil sie mit CVS nicht zufrieden waren.

Vorteile gegenüber CVS:

  • svn kann transparent mit Binärdateien umgehen
  • Dateien können aus dem Repository gelöscht, umbenannt und kopiert werden, dabei wird immer die komplette Dateihistory mitgezogen, dazu sind aber die subversion Kommandos zu verwenden. svn move svn rename ... und ein abschließendes svn commit ist nötig.
  • svn ist bei großen Datenmengen, dank Kompression, deutlich schneller.
  • ...

Subversion Befehle und Funktionen

Directory anfänglich ins Repository bringen

Zuerst ins Arbeitsverzeichnis wechseln, also in den Projektordner selbst, nicht in den darüberliegenden!

svn import -m "Kommentar" <verzeichnisname> <url>

Der verzeichnisname ist der Name des lokalen Verzeichnisses, das die Quelldateien enthält

Die <url> bezeichnet die Position des svn-Repositorys, sie kann sowohl den lokalen als auch einen entfernten Rechner beschreiben. Der letzte Pfadbestandteil ist gleichzeitg der Projektname im Repository, da die URL den kompletten Pfad beinhaltet.

-m "Kommentar" kann weggelassen werden, jedoch öffnet sich dann ein Texteditor, der einen zur Kommentareingabe zwingt, was nicht schön ist.

Beispiele:

Repository auf lokalem Rechner:

svn import -m "Erste Version" ~/src/adress2005 file:///home/hein_mueck/svn/repos/adr2005

Bei einem lokelen Repository reicht auch ein normaler Dateipfad, das file:/// ist optional. Man beachte die drei Slashes!

Repository auf entferntem Server, der Apache und das SVN-Modul verwendet:

svn import -m "Erste Version" ~/src/adress2005 http://irgendein.server.com/repos/adr2005

Repository auf entferntem WEBDAV-Server:

svn import -m "Erste Version" ~/src/adress2005 http://irgendein.server.com:7382/repos/adr2005

Repository auf einem entfernten subversion Repository-Server:

svn import -m "Erste Version" ~/src/adress2005 svn://irgendein.server.com:7382/repos/adr2005

Repository auf einem entfernten subversion Repository-Server durch ssh-tunnel:

svn import -m "Erste Version" ~/src/adress2005 svn+ssh://irgendein.server.com:7382/repos/adr2005

Nach einem import muß ein checkout erfolgen, damit man mit den Dateien weiterarbeiten kann, sonst befinden sie sich nicht unter der Versionskontrolle. Dazu eine Ebene höher gehen, den Projektordner löschen und Checkout vornehmen.

Im weiteren Verlauf der Anleitung wird von einem lokalen Rechner ausgegangen.

Checkout (Aus Subversion laden)

Um sich ein Projekt zum Bearbeiten zu holen, muß man es auschecken:

svn checkout <url> [Pfad]

checkout funktioniert nur, wenn noch keine Dateien gleichen Namens vorhanden sind. Bevor ein checkout nach einem import im gleichen Verzeichnis funktioniert, müssen demzufolge die alten Dateien erst gelöscht werden.

Beispiel:

Auschecken von adr2005 - das Verzeichnis adr2005 wird dabei im aktuellen Verzeichnis erstellt:

svn checkout file:///home/hein_mueck/svn/repos/adr2005

Auschecken des Inhalts von adr2005 in das aktuelle Verzeichnis:

svn checkout file:///home/hein_mueck/svn/repos/adr2005 .

Commit (Änderungen ins Repository schreiben)

Hat man seine Änderungen getätigt und möchte sie ins Repository zurückschreiben benutzt man das Kommando commit:

svn commit -m "kommentar" [Dateiliste]

Sollte -m"..." nicht angegeben worden sein, wird der Standard-Editor geöffnet und man muß einen Kommentar eingeben. IMHO aufwendiger als gleich einen Kommentar anzugeben.

Man kann einzelne Dateien durch Leerzeichen getrennt in der Dateiliste angeben. Wird sie weggelassen, werden alle geänderten Dateien ins Repository geschrieben.

Update (von anderen geänderte Dateien aus Subversion holen)

Haben andere Projektmitarbeiter zwischenzeitlich die Sourcen geändert, ist die eigene lokale Kopie nicht mehr aktuell. Mit update kann man sie aktualisieren:

svn update [Dateiliste]

Auch hier kann die Dateiliste weggelassen werden, es werden dann alle relevanten Dateien geholt.

Add (Neue Datei ins Repository einfügen)

Sollen neue Dateien oder ganze Verzeichnisbäume dem Projekt hinzugefügt werden, benutzt man den Befehl add.

svn add <Dateiliste>

<Dateiliste> kann eine Liste aus einer oder mehreren Dateien oder einem oder mehrerer Verzeichnisse (oder gemischt) sein. Verzeichnisse werden rekursiv hinzugefügt (was sich mit dem Parameter -N unterdrücken lässt. Die neuen Dateien und Verzeichnisse wandern nicht gleich ins Repository, sondern erst beim nächsten commit.

Dateien/Verzeichnisse entfernen

svn delete <Dateiliste>

Dateien/Verzeichnisse zum Löschen markieren. Subversion kümmert sich um das Entfernen der lokalen und Server-Kopien. Es darf nichts von Hand gelöscht werden.

Dateien/Verzeichnisse kopieren

svn copy <Dateiliste>

Dateien/Verzeichnisse umbenennen

svn move <Dateiliste>

Projektnamen ändern geht auch.

svn move http://irgendein.server.com/repos/ProjectName http://irgendein.server.com/repos/NewProjectName

Wichtig ist nur, den http:/... doppelt anzugeben.

Datei-Status anzeigen

Dabei wird zu jeder Datei, die Änderungen enthält nur genau eine Zeile ausgegeben. Sehr praktisch für den schnellen Überblick. CVS bot so etwas gar nicht.

svn status

$ svn status
  L    abc.c               # Datei ist gesperrt (locked)
M      bar.c               # Inhalt von bar.c wurde lokal modifiziert
 M     baz.c               # Metadaten von baz.c wurde lokal modifiziert, der Inhalt nicht
X      3rd_party           # Verzeichnis ist extern definiert 1)
?      foo.o               # foo.o ist nicht unter der Versionskontrolle
!      some_dir            # wird von svn verwaltet, ist jedoch unvollständig oder nicht vorhanden
~      qux                 # svn denkt es ist ein verzeichnis, ist aber eine Datei oder umgekehrt
I      .screenrc           # das file wird ignoriert
A  +   moved_dir           # Verschobene Datei (added with history)
M  +   moved_dir/README    # Verschoben und lokal modifiziert
D      stuff/fish.c        # zum Löschen markiert
A      stuff/loot/bloo.h   # zum Hinzufügen markiert
C      stuff/loot/lump.c   # Inhalts-Konflikt der per Hand aufgelöst werden muss 2)
    S  stuff/squawk        # Datei oder Verzeichnis wurde zu neuem Versionszweig

1) Erklärung: Externe definition
2) Konflikte auflösen

Hier auch die Ausführliche Erklärung der Status-Ausgaben

Properties nachträglich setzen

In einem Punkt unterscheidet sich svn deutlich von cvs: Ersetzungskürzel wie $Id$ $Author$ $Date$ usw. werden nicht automatisch im Quelltext aufgelöst. Es ist eine Philosophie von Subversion unter keinen Umständen Änderungen an den eingecheckten Dateien vorzunehmen, sofern es nicht ausdrücklich gewünscht wird. Diese Ersetzungen fallen unter diese Kategorie. Einschalten kann man das Verhalten mit der svn-Property 'keywords'. Die kann durch die Client-Konfiguration automatisch beim Import oder Add gesetzt werden, das nachträgliche setzen in der Arbeitskopie ist allerdings lästig, da es für jede Datei einzeln gemacht werden muss. Hiermit geht es direkt auf der aktuellen Revision im Repository, und zwar auch auf verzeichnisebene:

svn propset --revprop -r HEAD svn:keywords "Id Date Author Revision HeadURL" <URL zu Verzeichnis oder Datei im Repository>

Alternativ kann man auch die Eigenschaften auf der lokalen Arbeitskopie mit folgendem Befehl rekursiv setzen:

svn propset -R svn:keywords "Id Date Author Revision HeadURL" <lokales Verzeichnis>

Abschließend müssen die Änderungen dann per commit an das Repository übertragen werden. Ganz praktisch, wenn man eh noch lokal am Projekt arbeitet.

############################################################ Hier ist noch altes cvs-Zeug da umgeschrieben werden muss: !!!CVS Client Setup Variable @@CVSROOT@@ setzen (z.B. in der @@/etc/profile@@): (:box:) @@export CVSROOT=:pserver:samba@192.168.8.100:/mnt/daten/cvs@@ (:boxend:) !!!CVS Keywords Eine Datei, die ins CVS Repository eingecheckt wird, kann Spezielle Keywords enthalten, die durch CVS ersetzt werden. Das Besondere dieser Keywords ist, daß sie in zwei Schreibweisen funktionieren: (:box:) [@$Keyword$@] [@$Keyword: ''von cvs eingefügte Daten'' $@] (:boxend:) 1. wird durch CVS zu 2. ersetzt. Damit dann das Keyword bei späteren Commits noch erkannt wird, wird eben auch die zweite, bereits geparste Schreibweise von CVS akzeptiert. Genial einfach - einfach genial. Die wichtigsten Keywords sind: '''@@$Author$@@''' ->Name des Users, der die Dateien eingecheckt hat. Wenn CVS auf einem entfernten Server läuft ist es der Name des CVS-Users des Servers, egal wer darauf zugreift. Macht also nur Spaß wenn jeder einen anderen CVS-User benutzt der sinnigerweise genau so heißt wie sein User auf der lokalen Maschine. '''@@$Id$@@''' ->Ausführliche Versions-Information im Format ''Dateiname''. ''Version'', ''Datum/Uhrzeit des Eincheckens'', ''User der eingecheckt hat'' Beispiel: (:box:) @@$Id: filename.c,v 1.1. 2004/11/09 23:40:56 elsni Exp $@@ (:boxend:) Auch hier gilt das gleiche wie bei @@$Author$@@ '''@@$Log$@@''' ->Dieses Tag vermag eine automatische History zu führen, dazu müssen die Eincheckkommentare aber immer schön gepflegt werden (mit @@-m"Kommentar"@@). '''@@$Header$@@''' ->Wie @@$Id$@@ nur mit vollständigem Pfadnamen Es gibt noch viel mehr Wissenwertes über CVS, was man alles im %target=_blank%[[https://www.cvshome.org/docs/manual/ |Cederqvist Manual]] nachlesen kann. !!!CVS-Server aufsetzen Siehe [[http://home.wanadoo.nl/cwdegier/cvs-gentoo.html |CVS Server setup]], dort ist einfach beschrieben wie man so etwas unter Gentoo-Linux aufsetzt. Falls CVS schon läuft, ist es noch einfacher: In der @@/etc/inetd.conf@@ oder in der @@/etc/xinetd.d/cvspserver@@ nach @@--allow-root=@@ suchen und noch so einen Eintrag vornehmen, mit einem neuen Ort für das neue Repository. Der @@--allow-root=@@ Eintrag ist dann doppelt vorhanden. Repository anlegen: (:box:) @@cvs <''repository-pfad''> init@@ (:boxend:) Dann CVSROOT auschecken... (:box:) @@cvs checkout CVSROOT@@ (:boxend:) ...und die config Datei entsprechend dem obigem Setup-Guide anpassen. Wieder einchecken. Ein paar User mit @@htpasswd@@ anlegen und hinter jedem User in der [@/etc/passwd@]-Datei [@:cvsuser@] einfügen. Jetzt sollten nur die in der [@/etc/passwd@] angegebenen User sich einloggen können.

Tips und Tricks

Um zu verhindern das grep die .svn Verzeichnisse beim suchen mit durchsucht, kann eine Environmentvariable gesetzt werden.

 export GREP_OPTIONS="--exclude=\*.svn\*"

Dann werden die .svn Verzeichnisse beim grep ausgelassen.

Siehe auch

Links:

<< zurück zu Programmierung

Frische Änderungen | Menü editieren
zuletzt geändert am 24.03.2011 10:39 Uhr von Elsni
Edit Page | Page History