Zurück: Erste Schritte Inhalt: CVS benutzen Weiter: Wettrennen

    

Weiterlaufen



In Geschichtsbüchern schmökern (log)

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$

"Früher war alles anders!" Herausfinden, was sich wirklich verändert hat. (diff -r)

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 Vines  has 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 Vines  has 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 Vines  has rewritten the program for
- Microsoft Windows and called it `WinPenguins' - visit:
-       http://neomueller.org/~isamu/winpenguins/
-
tach
--- 43,46 ----
kai@fREUNd:~/xpenguins$

"Weißt du noch, damals... !" Alte Versionen betrachten (up -p -r)

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.

"Früher war es viel schöner!" Eine erste Zeitreise (up -r)

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?

Eine klebrige Angelegenheit: Sticky Tags (status)

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?

Hände waschen! (cvs up -A)

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