Subversion hat zahlreiche Features, Optionen und noch jede Menge Schnickschnack, aber für die tägliche Arbeit ist die Wahrscheinlichkeit groß, nur wenig davon zu benutzen. In diesem Abschnitt gehen wir durch die gebräuchlichsten Dinge, die Sie während des Tagesgeschäftes mit Subversion machen werden.
Der typische Arbeitszyklus sieht so aus:
Aktualisieren Sie Ihre Arbeitskopie.
svn update
Nehmen Sie Änderungen vor.
svn add
svn delete
svn copy
svn move
Untersuchen Sie Ihre Änderungen.
svn status
svn diff
Nehmen Sie eventuell einige Änderungen zurück.
svn revert
Lösen Sie Konflikte auf (arbeiten Sie die Änderungen anderer ein).
svn update
svn resolve
Bringen Sie Ihre Änderungen ins Projektarchiv.
svn commit
Wenn Sie in einem Projekt im Team zusammenarbeiten, sollten Sie Ihre Arbeitskopie aktualisieren, um die Änderungen zu bekommen, die die anderen Entwickler im Projekt seit Ihrer letzten Aktualisierung vorgenommen haben. Benutzen Sie svn update um Ihre Arbeitskopie synchron mit der letzten Revision im Projektarchiv zu bekommen:
$ svn update U foo.c U bar.c Aktualisiert zu Revision 2.
In diesem Fall sieht es so aus, dass jemand Änderungen
sowohl an foo.c
als auch an
bar.c
übergeben hat, seit Sie das letzte
Mal aktualisiert haben, und Subversion hat Ihre Arbeitskopie
aktualisiert, damit sie beide Änderungen enthält.
Wenn der Server über svn update
Änderungen an Ihre Arbeitskopie schickt, wird ein
Buchstabencode neben jedem Objekt angezeigt, um Ihnen
anzuzeigen, was Subversion gemacht hat, um die Arbeitskopie
auf den neuesten Stand zu bringen. Zur Bedeutung der
Buchstaben, rufen Sie svn help update
auf.
Nun können Sie loslegen und Änderungen an Ihrer Arbeitskopie vornehmen. Normalerweise ist es am einfachsten, sich für eine bestimmte Änderung (oder eine Menge von Änderungen) zu entscheiden, etwa ein neues Feature zu implementieren oder einen Fehler zu beseitigen usw. Die Subversion-Befehle, die Sie hierfür verwenden werden sind svn add, svn delete, svn copy, svn move und svn mkdir. Falls Sie jedoch größtenteils Dateien editieren, die bereits mit Subversion verwaltet werden, brauchen Sie keinen dieser Befehle, bis Sie die Änderungen übergeben.
Sie können zwei Arten von Änderungen an Ihrer Arbeitskopie vornehmen: Dateiänderungen und Verzeichnisbaumänderungen. Sie brauchen Subversion nicht mitzuteilen, dass Sie beabsichtigen, eine Datei zu ändern; nehmen Sie einfach die Änderungen mit Ihrem Texteditor, Textverarbeitungsprogramm, Grafikprogramm oder sonstigen Programm vor, wie Sie es gewohnt sind. Subversion stellt automatisch fest, welche Dateien sich geändert haben und behandelt dabei Binärdateien genauso einfach wie Textdateien – und genauso effizient. Für Änderungen am Verzeichnisbaum können Sie Subversion mitteilen, Dateien und Verzeichnisse zum geplanten Entfernen, Hinzufügen, Kopieren oder Verschieben „vorzumerken“. Diese Änderungen finden sofort in Ihrer Arbeitskopie statt, doch nichts wird dem Projektarchiv hinzugefügt oder daraus entfernt, bevor Sie die Änderungen übergeben.
Hier ist ein Überblick der fünf Subversion-Unterbefehle, die Sie am häufigsten benutzen werden, um Änderungen am Verzeichnisbaum vorzunehmen:
svn add foo
Die Datei, das Verzeichnis oder den symbolischen
Link foo
zum Hinzufügen in das
Projektarchiv vormerken. Wenn Sie das nächste Mal übergeben,
wird foo
ein Kind seines
Elternverzeichnisses. Beachten Sie, dass alles unterhalb
von foo
zum Hinzufügen vorgemerkt
wird, falls foo
ein Verzeichnis
ist. Falls Sie nur foo
selber
hinzufügen möchten, geben Sie die --depth
empty
-Option an.
svn delete foo
Die Datei, das Verzeichnis oder den symbolischen
Link foo
zum Löschen aus dem
Projektarchiv vormerken. foo
wird
sofort aus der Arbeitskopie entfernt, falls es eine
Datei oder ein Link ist. Falls foo
ein Verzeichnis ist, wird es nicht gelöscht, sondern zum
Löschen vorgemerkt. Wenn Sie Ihre Änderungen übergeben,
wird das gesamte Verzeichnis foo
aus der Arbeitskopie und dem Projektarchiv entfernt.
[4]
svn copy foo bar
Erzeuge ein neues Objekt bar
als Duplikat von foo
und merke
bar
automatisch zum Hinzufügen vor.
Wird bei der nächsten Übergabe bar
dem
Projektarchiv hinzugefügt, wird die Historie der Kopie
mitaufgezeichnet (so wie sie ursprünglich in
foo
war). svn
copy erzeugt keine Zwischenverzeichnisse,
sofern nicht die Option --parents
angegeben wird..
svn move foo bar
Dieser Befehl macht genau das gleiche wie
svn copy foo bar; svn delete foo
.
D.h., bar
wird zum Hinzufügen als
Kopie von foo
und
foo
selbst zum Löschen vorgemerkt.
svn move erzeugt keine
Zwischenverzeichnisse, sofern nicht die Option
--parents
angegeben wird.
svn mkdir blort
Dieser Befehl macht genau das gleiche wie
mkdir blort; svn add blort
. D.h., ein
neues Verzeichnis namens blort
wird
angelegt und zum Hinzufügen vorgemerkt.
Sobald Sie mit Ihren Änderungen fertig sind, müssen Sie sie ins Projektarchiv bringen; bevor Sie das jedoch machen, ist es normalerweise eine gute Idee, sich die Änderungen noch einmal anzusehen. Dadurch, dass Sie die Änderungen noch einmal begutachten, können Sie eine genauere Log-Nachricht schreiben. Sie könnten auch feststellen, dass Sie versehentlich eine Datei geändert haben, und hier haben Sie die Möglichkeit, vor der Übergabe die Änderung rückgängig zu machen. Zusätzlich bietet sich hierbei eine gute Gelegenheit, die Änderungen vor der Veröffentlichung noch einmal genau durchzugehen. Sie können sich mit svn status einen Überblick über Ihre Änderungen verschaffen und mit svn diff die Änderungen im Detail anzeigen lassen.
Subversion ist optimiert worden, um Ihnen bei dieser
Aufgabe zu helfen, und es ist in der Lage, viele Dinge zu tun,
ohne mit dem Projektarchiv kommunizieren zu müssen. Im Besonderen
enthält Ihre Arbeitskopie eine versteckte
„unveränderte“ Kopie jeder versionskontrollierten
Datei innerhalb des .svn
-Bereichs.
Deswegen kann Ihnen Subversion schnell zeigen, wie sich Ihre
bearbeiteten Dateien geändert haben, und es erlaubt Ihnen
sogar, Ihre Änderungen zurückzunehmen, ohne Verbindung mit dem
Projektarchiv aufnehmen zu müssen.
Um einen Überblick über Ihre Änderungen zu bekommen, werden Sie den svn status-Befehl verwenden. Wahrscheinlich werden Sie den Befehl svn status häufiger benutzen als alle anderen Subversion-Befehle.
Wenn Sie svn status ganz oben in
Ihrer Arbeitskopie aufrufen, werden alle Datei- und
Verzeichnisbaumänderungen erfasst, die Sie gemacht haben.
Hier sind einige Beispiele der häufigsten Statuscodes, die
svn status zurückgeben kann. (Beachten
Sie, dass der Text, der #
folgt, nicht
von svn status ausgegeben wird.)
? scratch.c # Datei ist nicht versionskontrolliert A stuff/loot/bloo.h # Datei ist zum Hinzufügen vorgemerkt C stuff/loot/lump.c # Datei hat Konflikte durch einen Update D stuff/fish.c # Datei ist zum Löschen vorgemerkt M bar.c # Der Inhalt von bar.c hat lokale Änderungen
In diesem Ausgabeformat zeigt svn status sechs Spalten mit Zeichen, gefolgt von mehreren Leerzeichen, gefolgt von einem Datei- oder Verzeichnisnamen an. Die erste Spalte gibt Aufschluss über den Zustand einer Datei oder eines Verzeichnisses und/oder des entsprechenden Inhalts.
A item
Die Datei, das Verzeichnis oder der symbolische
Link item
ist zum Hinzufügen in
das Projektarchiv vorgemerkt.
C item
Die Datei item
befindet sich
in einem Konfliktzustand. D.h., Änderungen, die vom
Server bei einer Aktualisierung empfangen wurden,
überlappen sich mit lokalen Änderungen, die Sie in
Ihrer Arbeitskopie haben (und konnten beim
Aktualisieren nicht automatisch aufgelöst werden). Sie
müssen den Konflikt auflösen, bevor Sie Ihre
Änderungen in das Projektarchiv übergeben können.
D item
Die Datei, das Verzeichnis oder der symbolische
Link item
ist zum Löschen im
Projektarchiv vorgemerkt.
M item
Der Inhalt der Datei item
ist geändert worden.
Wenn Sie einen speziellen Pfad an svn status übergeben, bekommen Sie nur Informationen über das Objekt alleine:
$ svn status stuff/fish.c D stuff/fish.c
svn status hat auch eine
--verbose
-Option (-v
),
die Ihnen den Zustand jedes Objektes in
der Arbeitskopie anzeigt, selbst wenn es sich nicht geändert
hat:
$ svn status -v M 44 23 sally README 44 30 sally INSTALL M 44 20 harry bar.c 44 18 ira stuff 44 35 harry stuff/trout.c D 44 19 ira stuff/fish.c 44 21 sally stuff/things A 0 ? ? stuff/things/bloo.h 44 36 harry stuff/things/gloo.c
Dies ist das „lange Format“ der Ausgabe von svn status. Die Buchstaben in der ersten Spalte bedeuten dasselbe wie vorher, jedoch zeigt die zweite Spalte die Arbeitsrevision des Objektes an. Die dritte und vierte Spalte zeigen die Revision der letzten Änderung an und wer es geändert hat.
Keiner der vorangegangenen Aufrufe von svn
status stellt eine Verbindung zum Projektarchiv
her – stattdessen werden die Metadaten im
Verzeichnis .svn
mit der Arbeitskopie
verglichen. Schließlich gibt es die
--show-updates
-Option (-u
),
die eine Verbindung zum Projektarchiv herstellt, und
Informationen darüber bereitstellt, was nicht mehr aktuell
ist:
$ svn status -u -v M * 44 23 sally README M 44 20 harry bar.c * 44 35 harry stuff/trout.c D 44 19 ira stuff/fish.c A 0 ? ? stuff/things/bloo.h Status bezogen auf Revision: 46
Beachten Sie die zwei Sternchen: Wenn Sie an dieser
Stelle svn update
aufrufen würden,
erhielten Sie Änderungen an README
und
trout.c
. Das gibt Ihnen einige sehr
wichtige Informationen – Sie müssen aktualisieren, um
die Änderungen auf dem Server an README
mitzubekommen, bevor Sie übergeben, oder das Projektarchiv wird
Ihre Übergabe ablehnen, da sie nicht aktuell ist (mehr dazu
später).
svn status kann viel mehr Informationen über Dateien und Verzeichnisse in Ihrer Arbeitskopie anzeigen als wir hier gezeigt haben – für eine erschöpfende Beschreibung von svn status und dessen Ausgabe, siehe svn status.
Eine andere Möglichkeit, Ihre Änderungen zu untersuchen,
ist, den svn diff-Befehl zu verwenden.
Sie können genau herausfinden, wie sie
etwas geändert haben, indem Sie svn
diff
ohne Argumente aufrufen, das Ihnen
Dateiänderungen im unified-diff-Format
anzeigt:
$ svn diff Index: bar.c =================================================================== --- bar.c (revision 3) +++ bar.c (working copy) @@ -1,7 +1,12 @@ +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> + +#include <stdio.h> int main(void) { - printf("Sixty-four slices of American Cheese...\n"); + printf("Sixty-five slices of American Cheese...\n"); return 0; } Index: README =================================================================== --- README (revision 3) +++ README (working copy) @@ -193,3 +193,4 @@ +Note to self: pick up laundry. Index: stuff/fish.c =================================================================== --- stuff/fish.c (revision 1) +++ stuff/fish.c (working copy) -Welcome to the file known as 'fish'. -Information on fish will be here soon. Index: stuff/things/bloo.h =================================================================== --- stuff/things/bloo.h (revision 8) +++ stuff/things/bloo.h (working copy) +Here is a new file to describe +things about bloo.
Der svn diff-Befehl erzeugt diese
Ausgabe, indem er Ihre Arbeitsdateien mit den
„unveränderten“ Kopien im Cache innerhalb des
.svn
-Bereichs vergleicht. Dateien, die
zum Hinzufügen vorgemerkt sind, werden vollständig als
hinzugefügter Text dargestellt, und Dateien, die zum Löschen
vorgemerkt sind, werden vollständig als gelöschter Text
dargestellt.
Die Ausgabe wird im unified-diff-Format dargestellt.
D.h., gelöschte Zeilen werden mit einem vorangestellten
-
und hinzugefügte Zeilen mit einem
vorangestellten +
angezeigt.
svn diff gibt auch Dateinamen und
Offset-Informationen aus, die das patch-Programm
verwenden kann, so dass Sie „Patches“
erzeugen können, indem Sie die diff-Ausgabe in eine Datei
umleiten:
$ svn diff > patchfile
Zum Beispiel können Sie die Patch-Datei vor einer Übergabe an einen anderen Entwickler zur Kontrolle oder zum Testen schicken.
Subversion verwendet seinen eingebauten
diff-Algorithmus, der standardmäßig das unified-diff-Format
benutzt. Falls Sie die Ausgabe von diff in einem anderen
Format haben möchten, geben Sie ein externes diff-Programm
mit der --diff-cmd
-Option an, und übergeben
Sie ihm beliebige Flags mit der
--extensions
-Option (-x
).
Um z.B. lokale Unterschiede in der Datei
foo.c
im Kontext-Ausgabeformat anzeigen
zu lassen und dabei die Groß- und Kleinschreibung zu
ignorieren, könnten Sie svn diff --diff-cmd
/usr/bin/diff --extensions '-i' foo.c
aufrufen.
Angenommen, Sie stellen beim Ansehen der Ausgabe von svn diff fest, dass alle Änderungen, die Sie an einer bestimmten Datei gemacht haben, fehlerhaft waren. Vielleicht hätten Sie die Datei überhaupt nicht ändern sollen, oder es wäre einfacher, von Anfang an unterschiedliche Änderungen zu machen.
Dies ist die perfekte Gelegenheit, svn revert zu benutzen:
$ svn revert README Rückgängig gemacht: »README«
Subversion stellt die Datei wieder so her, wie sie vor der
Änderung war, indem sie mit der
„unveränderten“ Kopie aus dem Cache im
.svn
-Bereich überschrieben wird. Beachten
Sie aber auch, dass svn revert
jegliche vorgemerkten Operationen
rückgängig machen kann – z.B. könnten Sie sich
entscheiden, eine neue Datei erst gar nicht hinzufügen zu
wollen:
$ svn status foo ? foo $ svn add foo A foo $ svn revert foo Rückgängig gemacht: »foo« $ svn status foo ? foo
Anmerkung | |
---|---|
|
Oder vielleicht haben Sie die Datei versehentlich aus der Versionsverwaltung gelöscht:
$ svn status README $ svn delete README D README $ svn revert README Rückgängig gemacht: »README« $ svn status README
Wir haben bereits gesehen, wie svn status
-u
Konflikte vorhersagen kann. Angenommen, Sie
starten svn update und einige interessante
Dinge passieren:
$ svn update U INSTALL G README Konflikt in »bar.c« entdeckt. Auswahl: (p) zurückstellen, (df) voller Diff, (e) editieren, (h) Hilfe für weitere Optionen:
Die Codes U
und
G
sind kein Grund zur
Beunruhigung; diese Dateien haben die Änderungen aus dem
Projektarchiv sauber aufgenommen. Die mit
U
markierten Dateien
enthielten keine lokalen Änderungen, wurden jedoch mit
Änderungen aus dem Projektarchiv
geU
pdatet. Das
G
steht für
merG
ed, was bedeutet, dass
die Datei zwar lokale Änderungen enthielt, die Änderungen aus
dem Projektarchiv sich aber nicht damit überschnitten
haben.
Die nächsten beiden Zeilen jedoch sind Teil eines Features
(neu in Subversion 1.5) namens interaktive
Konfliktauflösung. Das bedeutet, dass die
Änderungen vom Server sich mit Ihren eigenen überschneiden,
uns Sie nun die Gelegenheit haben, den Konflikt aufzulösen.
Die gebräuchlichsten Optionen werden angezeigt, aber alle
Optionen können sie sehen, wenn Sie
h
eintippen:
… (p) zurückstellen - den Konflikt erst später auflösen (df) voller Diff - alle Änderungen in der zusammengeführten Datei anzeigen (e) editieren - zusammengeführte Datei in einem Editor ändern (r) aufgelöst - akzeptieren der zusammengeführten Version der Datei (mf) volle eigene Datei - die eigene Version der kompletten Datei akzeptieren (ignorieren fremder Änderungen) (tf) volle fremde Datei - die fremde Version der kompletten Datei akzeptieren (verlieren eigener Änderungen) (l) starten - Starten eines externen Programms zur Konfliktauflösung (h) Hilfe - diese Liste anzeigen
Bevor wir im Detail erklären, was jede Option bedeutet, gehen wir noch mal eben die Optionen durch.
p
)ostpone
Die Datei im Konfliktzustand lassen, um nach Abschluss der Aktualisierung die Konfliktauflösung durchzuführen.
d
)iff
Die Unterschiede zwischen der Basisrevision und der Konfliktdatei im unified-diff-Format anzeigen.
e
)dit
Die Konfliktdatei im bevorzugten Editor, wie in
der Umgebungsvariablen EDITOR
angegeben, öffnen.
r
)esolved
Nach dem Bearbeiten einer Datei teilen Sie svn mit, dass Sie die Konflikte in der Datei aufgelöst haben und der aktuelle Inhalt übernommen werden soll.
m
)ine-(f
)ull
Die neuen vom Server erhaltenen Änderungen verwerfen und nur Ihre lokalen Änderungen an der zu überprüfenden Datei verwenden.
t
)heirs-(f
)ull
Ihre lokalen Änderungen an der zu überprüfenden Datei verwerfen und nur die neuen vom Server erhaltenen Änderungen verwenden.
l
)aunch
Ein externes Programm zur Konfliktauflösung starten. Das setzt Vorbereitungen voraus.
h
)elp
Die Liste aller bei der interaktiven Konfliktauflösung möglichen Befehle anzeigen.
Wir werden diese Befehle nun detaillierter behandeln, wobei sie nach Funktionalität gruppiert werden.
Bevor Sie entscheiden, wie Sie einen Konflikt beseitigen
wollen, wollen Sie wahrscheinlich genau sehen, worin der
Konflikt besteht, und benutzen hierfür den Befehl
diff (d
):
… Select: (p) postpone, (df) diff-full, (e) edit, (h)elp for more options : d --- .svn/text-base/sandwich.txt.svn-base Tue Dec 11 21:33:57 2007 +++ .svn/tmp/tempfile.32.tmp Tue Dec 11 21:34:33 2007 @@ -1 +1,5 @@ -Just buy a sandwich. +<<<<<<< .mine +Go pick up a cheesesteak. +======= +Bring me a taco! +>>>>>>> .r32 …
Die erste Zeile des diff-Inhalts zeigt den vorherigen
Inhalt der Arbeitskopie (die BASE
-Revision),
die nächste Zeile beinhaltet Ihre Änderung und
die letzte Zeile ist die Änderung, die soeben vom Server
empfangen worden ist (gewöhnlich die
HEAD
-Revision). Mit diesen Informationen
sind Sie bereit für den nächsten Schritt.
Es gibt vier verschiedene Wege, um Konflikte interaktiv aufzulösen – von denen Ihnen zwei erlauben, Änderungen selektiv zusammenzuführen und zu editieren und zwei, die es Ihnen erlauben, einfach eine Version der Datei auszuwählen und weiterzumachen.
Falls Sie eine beliebige Kombination Ihrer lokalen
Änderungen auswählen wollen, können Sie den
„edit“-Befehl (e
)
verwenden, um die Datei mit den Konfliktmarken manuell in
einem Texteditor (der durch die Umgebungsvariable
EDITOR
bestimmt wird) zu bearbeiten. Die
Datei händisch in Ihrem Lieblingseditor zu bearbeiten ist
eine Art Konflikte zu beseitigen, die sich einer ziemlich
schlichten Technik bedient (siehe „Manuelle Konfliktauflösung“ für einen
Beispieldurchgang), so dass manche Leute lieber feinste
Zusammenführungs-Werkzeuge benutzen.
Um ein Zusammenführungs-Werkzeug benutzen zu können, müssen Sie
entweder die Umgebungsvariable SVN_MERGE
setzen oder die merge-tool-cmd
-Option in
Ihrer Subversion-Konfigurationsdatei definieren (siehe „Konfigurationsoptionen“ für weitere Details).
Subversion übergibt vier Argumente an das Zusammenführungs-Werkzeug: die
BASE
-Revision der Datei, die
Dateirevision, die durch die Aktualisierung vom Server empfangen
wurde, die Dateirevision, die Ihre lokale Bearbeitung
beinhaltet und die zusammengeführte Kopie der Datei (die
Konfliktmarken enthält). Falls Ihr Zusammenführungs-Werkzeug die Argumente
in einer anderen Reihenfolge oder in einem anderen Format
erwartet, werden Sie ein Skript drumherum schreiben müssen,
das von Subversion aufgerufen wird. Nachdem Sie die Datei
bearbeitet haben und zufrieden mit Ihren Änderungen sind,
können Sie Subversion mitteilen, dass für die bearbeitete
Datei kein Konflikt mehr besteht, indem sie den
„resolve“-Befehl (r
)
benutzen.
Falls Sie entscheiden, dass Sie keine Änderungen
zusammenführen brauchen, sondern lediglich eine der beiden
Dateiversionen akzeptieren wollen, können Sie entweder Ihre
Änderungen (auch „meine“) mit dem
„mine-full“-Befehl (mf
)
oder die der Anderen mit dem „theirs-full“-Befehl
(tf
) auswählen.
Das hört sich vielleicht an wie ein passender Abschnitt
zur Vermeidung von Ehestreitigkeiten, doch es geht immer
noch um Subversion; also lesen Sie weiter. Falls Sie eine
Aktualisierung vornehmen und ein Konflikt auftaucht, den Sie
nicht begutachten oder auflösen können, ermöglicht Ihnen das
Eingeben von p
die Konfliktauflösung
Datei für Datei aufzuschieben, wenn Sie svn
update
aufrufen. Falls Sie aktualisieren wollen,
ohne Konflikte aufzulösen, können Sie die
--non-interactive
-Option an svn
update übergeben, und jede Datei mit Konflikten
wird automatisch mit einem
C
gekennzeichnet.
Das C
bedeutet
c
onflict. Das heißt, dass
die Änderungen vom Server sich mit Ihren eigenen
überschneiden, und Sie nach Abschluss der Aktualisierung
manuell aus den Änderungen wählen müssen. Wenn Sie eine
Konfliktauflösung verschieben, macht svn
typischerweise drei Dinge, um Ihnen bei der
Konfliktauflösung zu helfen:
Subversion gibt ein
C
während der
Aktualisierung aus und merkt sich, dass die Datei in
einem Konfliktzustand ist.
Falls Subversion die Datei als geeignet zum
Zusammenführen ansieht, fügt es
Konfliktmarken – besondere
Zeichenketten, die die Konfliktregion begrenzen –
in die Datei ein, um die überlappenden Bereiche
besonders hervorzuheben. (Subversion verwendet die Eigenschaft
svn:mime-type
, um
festzustellen, ob sich die Datei kontextuell zeilenweise
zusammenführen lässt. Siehe „Datei-Inhalts-Typ“, um
mehr zu erfahren.)
Für jede Datei mit Konflikten stellt Subversion drei zusätzliche unversionierte Dateien in Ihre Arbeitskopie:
filename.mine
Dies ist Ihre Datei aus der Arbeitskopie bevor
Sie aktualisierten – d.h. ohne
Konfliktmarken. Diese Datei beinhaltet nur Ihre
letzten Änderungen. (Falls Subversion diese Datei
als nicht-zusammenführbar erachtet, wird die
.mine
-Datei nicht erstellt,
da sie identisch mit der Datei der Arbeitskopie
wäre.)
filename.rOLDREV
Dies ist die Datei, die die
BASE
-Revision war bevor Sie
Ihre Arbeitskopie aktualisiert haben; also die
Datei, die Sie ausgecheckt hatten, bevor Sie Ihre
letzten Änderungen machten.
filename.rNEWREV
Dies ist die Datei, die Ihr Subversion-Client
soeben vom Server erhalten hat als Sie Ihre
Arbeitskopie aktualisierten. Diese Datei
entspricht der HEAD
-Revision
des Projektarchivs.
Hierbei ist OLDREV
die
Revisionsnummer der Datei in Ihrem
Verzeichnis .svn
, und
NEWREV
ist die
Revisionsnummer von HEAD
im
Projektarchiv.
Beispielsweise ändert Sally die Datei
sandwich.txt
aus dem Projektarchiv. Harry
hat gerade diese Datei in seiner Arbeitskopie geändert und
übergeben. Sally aktualisiert Ihre Arbeitskopie vor dem
übergeben und bekommt einen Konflikt, den sie
verschiebt:
$ svn update Konflikt in »sandwich.txt« entdeckt. Auswahl: (p) zurückstellen, (df) voller Diff, (e) editieren, (h) Hilfe für weitere Optionen: p C sandwich.txt Aktualisiert zu Revision 2. $ ls -1 sandwich.txt sandwich.txt.mine sandwich.txt.r1 sandwich.txt.r2
An dieser Stelle erlaubt Subversion Sally
nicht, die Datei
sandwich.txt
an das Projektarchiv zu
übergeben, solange die drei temporären Dateien nicht
entfernt werden:
$ svn commit -m "Add a few more things" svn: Übertragen schlug fehl (Details folgen): svn: Übertragung abgebrochen: »/home/sally/svn-work/sandwich.txt« bleibt im Konflikt
Falls Sie eine Konfliktauflösung aufgeschoben haben,
müssen Sie den Konflikt auflösen, bevor Ihnen Subversion
erlaubt, Ihre Änderungen in das Projektarchiv einzustellen. Sie
werden dafür den svn resolve-Befehl mit
einem von mehreren Argumenten für die
--accept
-Option aufrufen.
Falls Sie die Dateiversion vor Ihren Änderungen haben
möchten, wählen Sie das
base
-Argument.
Falls Sie die Version möchten, die nur Ihre Änderungen
enthält, wählen Sie das
mine-full
-Argument.
Falls Sie die Version möchten, die Ihre letzte
Aktualisierung vom Server gezogen hat (und somit Ihre
Änderungen vollständig verwerfen wollen), wählen Sie das
Argument theirs-full
.
Wenn Sie jedoch frei aus Ihren Änderungen und den
Änderungen vom Server wählen möchten, führen Sie den
konfliktbehafteten Text „händisch“ zusammen
(indem Sie die Konfliktmarken in der Datei begutachten und
editieren) und wählen das
working
-Argument.
svn resolve entfernt die drei
temporären Dateien und akzeptiert die Version, die Sie mit
der --accept
-Option angeben. Subversion
betrachtet die Datei nun als nicht mehr
konfliktbehaftet:
$ svn resolve --accept working sandwich.txt Konflikt von »sandwich.txt« aufgelöst
Das manuelle Auflösen von Konflikten kann ganz schön einschüchternd sein, wenn Sie es das erste Mal versuchen; jedoch kann es mit etwas Übung so leicht werden, wie vom Fahrrad zu fallen.
Hier ist ein Beispiel. Aufgrund einer schlechten Absprache
bearbeiten Sie und Ihre Mitarbeiterin Sally gleichzeitig die
Datei sandwich.txt
. Sally übergibt
ihre Änderungen an das Projektarchiv, und sobald Sie versuchen,
Ihre Arbeitskopie zu aktualisieren, erhalten Sie einen
Konflikt und müssen sandwich.txt
bearbeiten, um den Konflikt aufzulösen. Zunächst wollen wir
uns die Datei einmal ansehen:
$ cat sandwich.txt Top piece of bread Mayonnaise Lettuce Tomato Provolone <<<<<<< .mine Salami Mortadella Prosciutto ======= Sauerkraut Grilled Chicken >>>>>>> .r2 Creole Mustard Bottom piece of bread
Die Zeichenketten aus Kleiner-als-Zeichen, Gleichheitszeichen und Größer-als-Zeichen sind Konfliktmarken und gehören nicht zu den eigentlichen Daten, die in Konflikt stehen. Im Allgemeinen werden Sie sicherstellen wollen, dass die Konflikte aus der Datei entfernt werden, bevor sie das nächste Mal eine Übergabe durchführen. Der Text zwischen den ersten beiden Marken besteht aus den Änderungen, die Sie im Konfliktbereich vorgenommen haben:
<<<<<<< .mine Salami Mortadella Prosciutto =======
Der Text zwischen der zweiten und der dritten Marke ist der Text aus Sallys Übergabe:
======= Sauerkraut Grilled Chicken >>>>>>> .r2
Für gewöhnlich werden Sie nicht einfach die Konfliktmarken mitsamt der Änderungen von Sally löschen wollen – sie wird furchtbar überrascht sein, wenn das Sandwich kommt und nicht das drauf ist, was sie wollte. Hier ist der Zeitpunkt gekommen, zu dem Sie zum Telefon greifen oder durch das Büro gehen und Sally erklären, dass man in einem italienischen Delikatessenladen kein Sauerkraut bekommt. [6] Sobald Sie sich über die zu übergebenden\ Änderungen einig sind, können Sie Ihre Datei bearbeiten und die Konfliktmarken entfernen:
Top piece of bread Mayonnaise Lettuce Tomato Provolone Salami Mortadella Prosciutto Creole Mustard Bottom piece of bread
Verwenden Sie jetzt svn resolve, und Sie sind bereit, Ihre Änderungen an das Projektarchiv zu übergeben:
$ svn resolve --accept working sandwich.txt Konflikt von »sandwich.txt« aufgelöst $ svn commit -m "Mach weiter mit meinem Sandwich, vergiss Sallys Änderungen."
Beachten Sie, dass svn resolve, anders als die meisten anderen Befehle, die wir in diesem Kapitel behandeln, erwartet, dass Sie ausdrücklich alle Dateien aufzählen, deren Konflikt Sie beseitigt haben. Auf alle Fälle sollten Sie sorgfältig vorgehen und svn resolve nur verwenden, falls Sie sicher sind, den Konflikt in Ihrer Datei beseitigt zu haben – sobald die temporären Dateien entfernt sind, lässt Subversion zu, dass Sie die Datei in das Projektarchiv stellen, selbst wenn sie noch Konfliktmarken enthält.
Falls Sie mal bei der Bearbeitung der konfliktbehafteten Datei verwirrt sein sollten, können Sie jederzeit in den drei Dateien nachsehen, die Subversion für Sie in der Arbeitskopie bereitstellt – dazu gehört auch Ihre Datei vor der Aktualisierung. Sie können sogar ein Zusammenführungs-Werkzeug eines Drittanbieters verwenden, um diese drei Dateien zu untersuchen.
Falls Sie einen Konflikt erhalten und entscheiden, dass
Sie Ihre Änderungen verwerfen wollen, können Sie
svn resolve --accept theirs-full
aufrufen, und Subversion wird Ihre Änderungen ignorieren und
die temporären Dateien entfernen:CONFLICTED-PATH
$ svn update Konflikt in »sandwich.txt« entdeckt. Auswahl: (p) zurückstellen, (df) voller Diff, (e) editieren, (h) Hilfe für weitere Optionen: p C sandwich.txt Aktualisiert zu Revision 2. $ ls sandwich.* sandwich.txt sandwich.txt.mine sandwich.txt.r2 sandwich.txt.r1 $ svn resolve --accept theirs-full sandwich.txt Konflikt von »sandwich.txt« aufgelöst
Falls Sie sich entscheiden, Ihre Änderungen zu verwerfen und erneut mit der Bearbeitung zu beginnen (ob nach einem Konflikt oder sonst zu jeder Zeit), machen Sie einfach Ihre Änderungen rückgängig:
$ svn revert sandwich.txt Rückgängig gemacht: »sandwich.txt« $ ls sandwich.* sandwich.txt
Beachten Sie, dass Sie beim Rückgängigmachen einer konfliktbehafteten Datei nicht svn resolve zu verwenden brauchen.
Endlich! Sie haben die Bearbeitung abgeschlossen, Sie haben alle Änderungen vom Server eingearbeitet, und Sie sind bereit, Ihre Änderungen an das Projektarchiv zu übergeben.
Der Befehl svn commit schickt all Ihre
Änderungen zum Projektarchiv. Wenn Sie eine Änderung übergeben,
müssen Sie einen Protokolleintrag
erstellen, der die Änderung beschreibt. Dieser Eintrag wird mit
der von Ihnen erzeugten neuen Revision verknüpft. Wenn Ihr
Eintrag kurz ist, können Sie ihn mit der Option
--message
(oder -m
) in der
Kommandozeile angeben:
$ svn commit -m "Anzahl Käsescheiben korrigiert." Sende sandwich.txt Übertrage Daten . Revision 3 übertragen.
Falls Sie jedoch Ihren Protokolleintrag während der Arbeit
erstellen möchten, können Sie Subversion mitteilen, sich den
Eintrag aus einer Datei zu holen, indem Sie den Dateinamen mit
der Option --file
(-F
)
angeben:
$ svn commit -F logmsg Sende sandwich.txt Übertrage Daten . Revision 4 übertragen.
Sollten Sie vergessen, entweder die Option
--message
oder die
--file
-Option anzugeben, startet Subversion
automatisch Ihren Lieblingseditor (siehe die Information zu
editor-cmd
in „Config“), damit Sie
einen Protokolleintrag erstellen können.
Tipp | |
---|---|
Wenn Sie gerade in Ihrem Editor einen Eintrag schreiben und sich entschließen, die Übergabe abzubrechen, können Sie einfach Ihren Editor beenden, ohne die Änderungen zu sichern. Falls Sie den Eintrag bereits gesichert haben sollten, löschen Sie einfach den Text, sichern Sie erneut und brechen dann ab: $ svn commit Logmeldung unverändert oder nicht angegeben A)bbrechen, Weitermac)hen, E)ditieren: a $ |
Das Projektarchiv weiß nicht, ob Ihre Änderung im Ganzen einen Sinn ergeben, es ist ihm auch egal; es überprüft lediglich, ob nicht irgendjemand anderes irgendeine derselben Dateien geändert hat wie Sie, als Sie mal weggeschaut haben. Falls jemand das gemacht hat, wird die gesamte Übergabe mit einer Meldung fehlschlagen, dass eine oder mehrere Ihrer Dateien nicht mehr aktuell sind:
$ svn commit -m "Noch eine Regel hinzufügen" Sende rules.txt svn: Übertragen schlug fehl (Details folgen): svn: Datei »/rules.txt« ist veraltet …
(Der genaue Wortlaut dieser Fehlermeldung hängt vom verwendeten Netzwerkprotokoll und vom Server ab, doch die Bedeutung ist in allen Fällen gleich.)
Zu diesem Zeitpunkt müssen Sie svn
update
aufrufen, sich um eventuelle
Zusammenführungen oder Konflikte kümmern und die Übergabe
erneut versuchen.
Das deckt den grundlegenden Arbeitszyklus für die Verwendung von Subversion ab. Subversion bietet viele andere Möglichkeiten, die Sie benutzen können, um Ihr Projektarchiv und Ihre Arbeitskopie zu verwalten, doch der größte Teil Ihrer täglichen Arbeit mit Subversion wird lediglich die in diesem Kapitel behandelten Befehle berühren. Wir werden jedoch noch ein paar mehr Befehle behandeln, die Sie ziemlich oft verwenden werden.
[4] Selbstverständlich wird nichts jemals
vollständig aus dem Projektarchiv
gelöscht – lediglich aus der
HEAD
-Revision des Projektarchivs.
Sie können alles was Sie gelöscht haben zurückholen,
indem Sie eine Revision auschecken
(oder hierauf aktualisieren), die älter ist, als die
Revision Ihrer Löschung. Siehe auch „Zurückholen gelöschter Objekte“.
[5] Und Sie haben keine WLAN-Karte. Sie dachten wohl, Sie kriegen uns, was?
[6] Und wenn Sie danach fragen, wird man Sie wahrscheinlich auf einer Schiene aus der Stadt tragen.