Zurück: Erste Schritte Inhalt: CVS benutzen Weiter: Wettrennen
![]() |
Weiterlaufen |
Wie gezeigt wurde
(vgl. Was habe ich bloß getan??)
kann man mit cvs diff
die Änderungen seit dem letzten
checkin
anzeigen. Doch es sind nicht immer nur die Änderungen
interessant, die man gerade gemacht hat. Eventuell möchte man mal alle
Änderungen angezeigt bekommen, die man in mehreren Schritten gemacht hat,
seit man sich z.B. zu einer grundlegenden Änderung an einem Projekt
entschlossen hat.
Zu diesem Zweck muß man zunächst herausfinden, auf welchen Punkt in der
Vergangenheit man sich beziehen möchte. Man kann seine Zeitmaschine ja nicht
einfach so anschmeißen, wer weiß, wo man dann landen würde! Hier hilft das
CVS-Komando log
. Es zeig die Log-Nachrichten an, die beim
Checkin der Änderungen angegeben wurden, zusammen mit dem Datum des
Checkins und den Namen des Benutzers, der die Änderungen übertragen hat.
kai@fREUNd:~/xpenguins$ cvs log README RCS file: /home/kai/cvsroot/xpenguins/README,v Working file: README head: 1.4 branch: locks: strict access list: symbolic names: frisch_importiert: 1.1.1.1 foo: 1.1.1 keyword substitution: kv total revisions: 5; selected revisions: 5 description: ---------------------------- revision 1.4 date: 2003/05/12 19:52:38; author: kai; state: Exp; lines: +0 -2 tach-Zeile wieder entfernt... Modified Files: README ---------------------------- revision 1.3 date: 2003/05/12 19:52:09; author: kai; state: Exp; lines: +0 -6 Ich will keinen Hinweis auf Software für M$ Modified Files: README ---------------------------- revision 1.2 date: 2003/05/12 19:36:58; author: kai; state: Exp; lines: +1 -11 Wilde Entwicklungsphase erfolgreich abgeschlossen! Modified Files: README toon.h Added Files: LIESMICH ---------------------------- revision 1.1 date: 2003/05/09 17:34:47; author: kai; state: Exp; branches: 1.1.1; Initial revision ---------------------------- revision 1.1.1.1 date: 2003/05/09 17:34:47; author: kai; state: Exp; lines: +0 -0 xpenguins-Quellcode importiert =================================================================== kai@fREUNd:~/xpenguins$
Aus dem Log für die Datei README
mag nun das Interesse erwachsen,
herauszufinden, was man an der Datei seit dem Ende der "wilden
Entwicklungsphase" so alles geändert hat. Dies läßt sich mit folgendem
diff
-Aufruf herausfinden:
kai@fREUNd:~/xpenguins$ cvs diff -c -r 1.2 README Index: README =================================================================== RCS file: /home/kai/cvsroot/xpenguins/README,v retrieving revision 1.2 retrieving revision 1.4 diff -c -r1.2 -r1.4 *** README 12 May 2003 19:36:58 -0000 1.2 --- README 12 May 2003 19:52:38 -0000 1.4 *************** *** 42,52 **** The xpenguins homepage is located at: http://www.met.rdg.ac.uk/~swrhgnrj/xpenguins/ - - SEE ALSO - - Michael Vineshas rewritten the program for - Microsoft Windows and called it `WinPenguins' - visit: - http://neomueller.org/~isamu/winpenguins/ - - tach --- 42,44 ---- kai@fREUNd:~/xpenguins$
Der Schalter -r
gibt an, das ein Diff gegen die Version
1.2
der Datei hergestellt werden soll. Zu beachten ist dabei,
daß ein Diff der Datei, wie sie sich derzeit im Arbeitsverzeichnis befindet,
gegen die Version 1.2
gemacht wird. In dem Beispiel war die
Datei auf dem aktuellen Stand.
Deswegen wurde direkt ein diff
der beiden Versionen
1.2
und 1.4
durchgeführt. Hätte man seit dem
letzten Checkin weitere Änderungen an der Datei vorgenommen, so wäre
ein diff
gegen die veränderte Version in dem Arbeitsverzeichnis
gemacht worden:
kai@fREUNd:~/xpenguins$ echo Neue Zeile >> README kai@fREUNd:~/xpenguins$ cvs diff -c -r1.2 README Index: README =================================================================== RCS file: /home/kai/cvsroot/xpenguins/README,v retrieving revision 1.2 diff -c -r1.2 README *** README 12 May 2003 19:36:58 -0000 1.2 --- README 17 May 2003 11:20:58 -0000 *************** *** 42,52 **** The xpenguins homepage is located at: http://www.met.rdg.ac.uk/~swrhgnrj/xpenguins/ ! ! SEE ALSO ! ! Michael Vineshas rewritten the program for ! Microsoft Windows and called it `WinPenguins' - visit: ! http://neomueller.org/~isamu/winpenguins/ ! ! tach --- 42,45 ---- The xpenguins homepage is located at: http://www.met.rdg.ac.uk/~swrhgnrj/xpenguins/ ! Neue Zeile kai@fREUNd:~/xpenguins$
Zu Begin weißt CVS explizit darauf hin, welche Versionen gedifft werden.
diff -c -r1.2 README *** README 12 May 2003 19:36:58 -0000 1.2 --- README 17 May 2003 11:20:58 -0000
Hier sieht man daran, daß in der letzten Zeile keine Versions-Nummer genannt
wird, daß die Datei-Version 1.2
gegen die Datei-Version im Arbeitsverzeichnis gedifft wird, die noch
nicht ins Repository übertragen wurde.
Möchte man explizit zwei bestimmte Versionen der Datei überprüfen, die bereits
im Repository gespeichert sind, so kann man dies über zweimaliges verwenden
des Schalters -r
erreichen. Z.B. kann man sich mit folgendem
Aufruf davon überzeugen, daß der Log-Eintrag für die Version
1.3
die eingecheckten Veränderungen ausreichend umschreibt:
kai@fREUNd:~/xpenguins$ cvs diff -c -r 1.2 -r1.3 README Index: README =================================================================== RCS file: /home/kai/cvsroot/xpenguins/README,v retrieving revision 1.2 retrieving revision 1.3 diff -c -r1.2 -r1.3 *** README 12 May 2003 19:36:58 -0000 1.2 --- README 12 May 2003 19:52:09 -0000 1.3 *************** *** 43,52 **** http://www.met.rdg.ac.uk/~swrhgnrj/xpenguins/ - SEE ALSO - - Michael Vineshas rewritten the program for - Microsoft Windows and called it `WinPenguins' - visit: - http://neomueller.org/~isamu/winpenguins/ - tach --- 43,46 ---- kai@fREUNd:~/xpenguins$
Manchmal ist es vielleicht etwas verwirrend nur die Unterschiede zwischen zwei Dateiversionen zu sehen und man möchte viel lieber einfach eine alte Version der Datei betrachten. Dies erreicht man mit folgendem Aufruf:
kai@fREUNd:~/xpenguins$ cvs up -p -r 1.3 README |less
Der Schalter -p
erzwingt dabei, daß die Datei auf
STDOUT
ausgegeben wird. Der Befehl cvs up
kombiniert mit dem Schalter -r
versetzt nämlich eigentlich
die Arbeitskopie in einen vergangenen Zustand zurück. Dazu nun mehr.
Wie gesagt ersetzt cvs up -r VERSIONSNR
eine Datei in der
Arbeitskopie mit der geforderten Version. Wenn man wirklich die alte
Version der Datei haben will, ist darauf zu achten, daß die Datei in
der Arbeitskopie nicht verändert wurde, denn sonst führt CVS die aktuelle
und die angeforderte Version zu einer neuen Datei zusammen (was unter
bestimmten Umständen natürlich durchaus geünscht sein kann)!
kai@fREUNd:~/xpenguins$ cvs up -r1.1 penguins/def.h U penguins/def.h kai@fREUNd:~/xpenguins$
Die Anforderung einer alten Datei-Version per cvs up -r
ist aber nicht unbedingt das, was man sich als CVS-Neuling darunter
vorstellt. Diese alte Version kann nämlich (frei nach dem Motto, daß
man als Zeitreisender nichts an der Vergangenheit verändern sollte)
nicht verändert werden!
kai@fREUNd:~/xpenguins$ echo "Änderung der Vergangenheit" >> penguins/def.h kai@fREUNd:~/xpenguins$ cvs ci penguins/def.h cvs commit: sticky tag `1.1' for file `penguins/def.h' is not a branch cvs [commit aborted]: correct above errors first! kai@fREUNd:~/xpenguins$
Die obige Fehlermeldung besagt, daß man, wenn man wirklich eine alte
Version der Datei verändern will, zunächst einen Branch
(im Fachjargon des Zeitreisenden: ein Parallel-Universum) erzeugen muß.
Oft ist das aber gar nicht, was man als CVS-Neuling wirklich will. Eigentlich will man meistens nur in der Gegenwart mit einer alten Version der Datei weiterarbeiten, weil man festgestellt hat, daß die Änderungen, die man vorgenommen hatte, Blödsinn sind. Kurz: man will einfach ein paar Änderungen rückgängig machen. Dies erreicht man mit folgendem Befehl:
kai@fREUNd:~/xpenguins$ cvs up -p -r1.1 README > README =================================================================== Checking out README RCS: /home/kai/cvsroot/xpenguins/README,v VERS: 1.1 *************** kai@fREUNd:~/xpenguins$
Das Resultat dieses Befehls ist, daß die Datei README den selben Inhalt
hat, wie die Version 1.1
im Repository. Der Unterschied zu dem
vorherigen Befehl ist, das CVS nicht weiß, woher diese Änderungen an der
Datei kommen. Für CVS könnten sie ebensogut von dem Benutzer per Hand
eingegeben worden sein.
Aber woher weiß CVS, daß die Änderungen an der Datei
penguins/def.h
nach dem Aufruf ohne -p
nicht
von dem Benutzer stammen?
Die Antwort lautet: Sticky Tags
. CVS speichert für jede Datei der
Arbeitskopie ein paar wesentliche Informationen (in der Datei
./CVS/Entries
). Diese können per cvs status
oder kurz cvs stat
abgefragt werden.
kai@fREUNd:~/xpenguins$ cvs stat penguins/def.h README =================================================================== File: def.h Status: Locally Modified Working revision: 1.1 Sat May 17 12:51:27 2003 Repository revision: 1.1 /home/kai/cvsroot/xpenguins/penguins/def.h,v Sticky Tag: 1.1 Sticky Date: (none) Sticky Options: (none) =================================================================== File: README Status: Locally Modified Working revision: 1.4 Sat May 17 14:16:20 2003 Repository revision: 1.4 /home/kai/cvsroot/xpenguins/README,v Sticky Tag: (none) Sticky Date: (none) Sticky Options: (none) kai@fREUNd:~/xpenguins$
Man sieht hier, daß CVS sich für die Datei penguins/def.h
mit Hilfe des Sticky Tag
gemerkt hat, daß diese in der Version
1.1
vorliegen soll. Dies ist nötig, da CVS sonst beim
nächsten Aufruf von cvs up
feststellen würde, daß die Version
1.1
, in der die Datei vorliegt, veraltet ist, und dann die
neuste Version aus dem Repository holen würde.
Im Fall der Datei README
, die wir mit cvs up -p
geholt haben, ist dies nicht nötig, da CVS davon ausgeht, daß wir die
neuste Version in unserem Arbeitsverzeichnis haben.
Aber wie wird man ein solches Sticky Tag
wieder los?
Ein Sticky Tag
kann mit dem Aufruf cvs up -A
gelöscht werden (Vorsicht: der Aufruf arbeitet ohne Dateiangabe
wie bei CVS üblich rekursiv das aktuelle Arbeitsverzeichnis und alle
untergeordneten Verzeichnisse mit ab!). Dabei ist aber darauf zu achten,
daß CVS nicht nur das Sticky Tag
löscht, sondern die Datei
gleichzeitig wieder auf die aktuellste Version bringt. Eventuelle lokale
Änderungen werden dabei mit in die neue Version übernommen! Dies
kann zu unerwünschten Nebeneffekten führen. Man sollte dem
Sticky Tag
also mit dem Schalter -p
aus dem Weg
gehen, wenn man es nicht explizit haben will!
kai@fREUNd:~/xpenguins$ cvs up -A penguins/def.h RCS file: /home/kai/cvsroot/xpenguins/penguins/def.h,v retrieving revision 1.1 retrieving revision 1.2 Merging differences between 1.1 and 1.2 into def.h rcsmerge: warning: conflicts during merge cvs update: conflicts found in penguins/def.h C penguins/def.h kai@fREUNd:~/xpenguins$
In unserem Fall führt das löschen des Sticky Tag
zu einem
Konflikt zwischen der Änderung, die wir an der alten Version der Datei
vornehmen wollten und der Änderung an dieser alten Version, die wir bereits
in das Repository übertragen hatten.
kai@fREUNd:~/xpenguins$ cvs stat penguins/def.h =================================================================== File: def.h Status: File had conflicts on merge Working revision: 1.2 Result of merge Repository revision: 1.2 /home/kai/cvsroot/xpenguins/penguins/def.h,v Sticky Tag: (none) Sticky Date: (none) Sticky Options: (none) kai@fREUNd:~/xpenguins$ tail penguins/def.h { floater_xpm, 8, 1, 30, 30, TOON_DEFAULTS }, { climber_xpm, 8, 2, 30, 30, TOON_DEFAULTS }, { bomber_xpm, 16, 1, 32, 32, TOON_NOCYCLE }, { explosion_xpm, 1, 1, 64, 64, TOON_NOCYCLE } }; <<<<<<< def.h Änderung der Vergangenheit ======= /* Sinnloser Text */ >>>>>>> 1.2 kai@fREUNd:~/xpenguins$
Dies leitet zum nächsten Thema über: Konflikte.
Zurück: Erste Schritte Inhalt: CVS benutzen Weiter: Wettrennen