2013-07-09 3 views
7

CVS macht mich wirklich verrückt!CVS entfernen Sticky Tag ohne Update

Gibt es einen Trick, um Sticky-Tags zu entfernen, ohne Dateiinhalte zu aktualisieren? Ich weiß 'cvs up -A' aber das ändert auch meine Dateien.

Oder andersherum: Gibt es eine Möglichkeit, ein komplettes Verzeichnis auf ein vorheriges Datum zu aktualisieren, ohne überhaupt Sticky-Tags zu setzen?

Hintergrund: Ich benutze eine Arbeitskopie, die sowohl mit CVS als auch mit HG versioniert ist, und ich habe es vermasselt, also möchte ich zum letzten Punkt zurückkehren, wo es synchron war und dann überprüfen, was kommen würde von CVS.

danke und grüße.

+0

ich auch, gerade jetzt, bin Versionierung sowohl mit HG und CVS (HG für meine eigene Bequemlichkeit, CVS, weil es Erbe Projekt). Ich habe ähnliches mit HG/GIT/CVS/RCS/BZR/... gemacht. oder schreiben Sie sich selbst ein How-To für solch ein multiples VCS-Tracking. –

Antwort

10

Das hängt vielleicht von Ihrer Version von CVS ab und kommt mit dem Vorbehalt, dass es nicht unterstützt wird, aber ich habe das sticky-Tag manuell aus der CVS/Entries-Datei entfernt. Ich habe das sehr oft gemacht, als ich meine Arbeitsversion auf eine frühere Version zurücksetzen wollte, aber das Klebeetikett vermeiden, damit ich es normal aktualisieren konnte, wenn ich fertig war.

Zuerst aktualisieren Sie die Datei einfach aus dem Repository auf die gewünschte Version. Aus Gründen der Sauberkeit hatte ich die Angewohnheit, zuerst meine lokale Kopie zu entfernen.

rm myfile 
cvs update -r 1.20 myfile 

Dies wird natürlich Sie mit dem klebrigen Tag verlassen.

cvs status myfile 
=================================================================== 
File: myfile  Status: Up-to-date 

    Working revision: 1.20 
    Repository revision: 1.20 /cvsroot/myproject/myfile,v 
    Sticky Tag:   1.20 
    Sticky Date:   (none) 
    Sticky Options:  (none) 

Das Sticky-Tag wird in der Datei CVS/Entries im letzten Feld gespeichert. Wenn Sie bei CVS/Entries mit einem Texteditor suchen und Ihre Dateinamen suchen, finden Sie diese:

/myfile/1.20/Thu Nov 6 18:22:05 2014//T1.20 

Die T1.20 am Ende den Sticky-Tag darstellt. Sie können es einfach entfernen, die Linie verlassen:

/myfile/1.20/Thu Nov 6 18:22:05 2014// 

Jetzt ist das sticky-Tag weg. Sie befinden sich in dem Zustand, in dem Sie sich befinden, wenn jemand eine neue Version eingecheckt hat und Sie noch nicht aktualisiert wurden.

cvs status myfile 
=================================================================== 
File: myfile  Status: Needs Patch 

    Working revision: 1.20 
    Repository revision: 1.21 /cvsroot/myproject/myfile,v 
    Sticky Tag:   (none) 
    Sticky Date:   (none) 
    Sticky Options:  (none) 

Sobald Sie überprüfen, ob diese auf einer einzigen Datei funktioniert und mutig erhalten, können Sie das gesamte Verzeichnis auf einmal tun, wenn Sie möchten, Ihre Lieblings-Werkzeug (Perl, awk, etc) jede Datei ändern in den CVS/Entries (oder nur die Zeilen, die Sie ändern möchten). Sie sollten natürlich Vorsicht walten lassen. Ich benutze Perl, und ein .backup immer wieder auf im Fall von Schwierigkeiten fallen:

perl -pi.backup -e 's|//T[\.0-9]+$|//|' CVS/Entries 
+0

Übrigens habe ich nicht das Gefühl, dass das Entfernen des klebrigen Etiketts im Konzept gefährlich ist. Es wäre natürlich besser über eine unterstützte Methode. Aber wie gesagt, der resultierende Zustand ist genau der selbe, als ob die Checkins in das Repository gestellt worden wären, nachdem Sie ursprünglich ausgecheckt hatten und Sie noch nicht aktualisiert worden waren. Wenn Sie lokale Änderungen haben, werden Sie aufgefordert, vor dem Aktualisieren zu fusionieren. Und wenn Sie keine lokalen Änderungen haben, können Sie sauber aktualisieren. – biomiker

+0

Glücklicherweise musste ich nicht mehr am CVS-Projekt arbeiten, also habe ich diese Antwort nicht getestet, aber ich akzeptiere diese als akzeptierte Antwort, weil sie meiner Suche am nächsten kommt. – Peter

+0

Die Arbeitsrevisionsnummer ist am Ende niedriger als das Repository. Daher kann ich die "abgerufene" Version nicht erneut festlegen. Die Fehlermeldung: "Aktuelle Überprüfung fehlgeschlagen für". Gibt es eine Lösung? –

0

Oder andersherum: Gibt es eine Möglichkeit, ein komplettes Verzeichnis zu einem frühen Zeitpunkt zu aktualisieren, ohne klebrig-Tags in dem ersten Platz Einstellung?

Das Sticky-Tag ist daran zu erinnern, dass Sie nicht in HEAD sind. Wenn Sie Änderungen vornehmen, werden sie dann nicht dorthin gehen. Und nur das Entfernen des klebrigen Etiketts könnte in normalen Situationen gefährlich sein.

Ich denke, der beste Weg zu gehen ist, einen Patch von dem Datum zu erstellen, dass die Repositories synchron zu einer aktualisierten Kopie waren. Dann wenden Sie den Patch umgekehrt an. Erstellen Sie einen Patch mit Ihren geänderten Änderungen und wenden Sie ihn auf das andere Repository an.

auf einem sauberen (aber nicht Repo synchronisiert):

$ cvs diff -R -D date_when_synced >patchfile

$ patch -R -pNUM <patchfile

Dann im Repo Sie die Änderungen vorgenommen Sie wollen nicht mit cvs up -A verlieren:

$ cvs diff -R >patchfile2

Dann wenden Sie den Patch im Repository "clean" an :

$ patch -pNUM <patchfile2

ich denke, das tun konnte, was Sie wollen, wenn ich es richtig verstanden.

1

Sie können die Option -p für "cvs up" verwenden, um auf die Standardausgabe zu schreiben, die Sie mit ">" in die Originaldatei umleiten können. Dies vermeidet Klebrigkeit.

+1

Das funktioniert, aber Sie haben den Status 'Lokal geändert'. Wenn Sie später aktualisieren möchten, müssen Sie diese Datei speziell erneut behandeln. – biomiker