Allgemein
Knowledge Base
- Neue Struktur (In Arbeit)
- Computertechnisches
Community
Privat
/ HomePage / Computer / Software / Programmierung / EntwicklerTools / SubversionBenutzen
Subversion installieren gibt es hier.
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 move
svn rename
... und ein abschließendes svn commit
ist nötig.
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.
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.
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.
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 .
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.
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.
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
.
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.
svn copy <Dateiliste>
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.
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
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.
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.