CVS elimină eticheta lipicioasă fără actualizare (Programare, Cvs)

Peter a intrebat.

CVS mă înnebunește cu adevărat!

Există vreun truc pentru a elimina etichetele lipicioase fără a actualiza conținutul fișierelor? Știu de „cvs up -A”, dar și acesta îmi modifică fișierele.

Sau invers: Există vreo modalitate de a actualiza un director complet la o dată anterioară, fără a seta etichete lipicioase în primul rând?

Context: Folosesc o copie de lucru care este versificată atât cu CVS, cât și cu HG și am dat-o peste cap, așa că vreau să mă întorc la ultimul punct în care a fost sincronizat și apoi să verific ce ar veni de la CVS.

Mulțumesc și salutări.

Comentarii

  • Și eu, în acest moment, versionez atât cu HG cât și cu CVS (HG pentru comoditatea mea, CVS pentru că este un proiect moștenit). Am făcut ceva similar cu HG/GIT/CVS/RCS/BZR/… Trebuie să găsim,. sau să scriem noi înșine, un how-to pentru o astfel de urmărire a mai multor VCS-uri. –  > Por Krazy Glew.
3 răspunsuri
biomiker

Acest lucru poate depinde de versiunea dvs. de CVS și vine cu avertismentul că nu este suportat, dar am folosit pentru a elimina manual eticheta lipicioasă din fișierul CVS / Entries. Am făcut acest lucru de multe ori când am vrut să dau înapoi versiunea mea de lucru la o versiune anterioară, dar să evit eticheta lipicioasă, astfel încât să pot actualiza în mod normal atunci când sunt gata.

În primul rând, actualizați fișierul la versiunea pe care o doriți din depozit. Pentru curățenie, aveam obiceiul de a elimina mai întâi copia mea locală.

rm myfile
cvs update -r 1.20 myfile

Acest lucru vă va lăsa, bineînțeles, cu eticheta lipicioasă.

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)

Eticheta lipicioasă este stocată în fișierul CVS/Entries în ultimul câmp. Dacă vă uitați în CVS/Entries cu un editor de text și căutați numele fișierului, veți găsi acest lucru:

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

T1.20 de la sfârșitul fișierului reprezintă eticheta lipicioasă. Puteți să o eliminați pur și simplu, lăsând linia:

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

Acum, eticheta lipicioasă a dispărut. Sunteți în aceeași stare în care ați fi dacă cineva ar fi verificat o versiune nouă și pur și simplu nu ați actualizat-o încă.

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)

După ce verificați că acest lucru funcționează pe un singur fișier și vă faceți curaj, dacă doriți, puteți face acest lucru cu întregul director deodată, folosind instrumentul preferat (perl, awk etc.) pentru a modifica fiecare fișier din CVS/Entries (sau numai acele linii pe care doriți să le modificați). Desigur, trebuie să fiți prudenți. Eu folosesc perl și păstrez o copie de rezervă .backup pe care să mă bazez în caz de probleme:

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

Comentarii

  • Apropo, nu consider că eliminarea etichetei lipicioase este periculoasă în concept. Ar fi bineînțeles că ar fi mai bine să se facă prin intermediul unei metode acceptate. Dar, așa cum am spus, starea rezultată este exact aceeași ca și cum verificările ar fi fost făcute în depozit după ce ați fi verificat inițial și nu ați fi actualizat încă. Dacă aveți modificări locale, vi s-ar spune să fuzionați înainte de a putea actualiza. Iar dacă nu aveți modificări locale, atunci puteți face actualizarea fără probleme. –  > Por biomiker.
  • Din fericire, nu am mai fost nevoit să lucrez la proiectul CVS moștenit, așa că nu am testat acest răspuns, dar îl voi accepta ca răspuns acceptat, deoarece se apropie cel mai mult de ceea ce căutam eu. –  > Por Peter.
  • Numărul reviziei de lucru este la sfârșit mai mic decât cel al depozitului. În consecință, nu pot trimite din nou versiunea „recuperată”. Mesajul de eroare: Up-to-date check failed for. Există o soluție? –  > Por Olivier Faucheux.
  • @OlivierFaucheux Dacă aveți modificări locale pe care doriți să le confirmați, este la fel ca și cum altcineva ar fi confirmat o actualizare. Mai întâi trebuie să faceți „cvs update myfile”, care va unifica în copia dvs. de lucru toate modificările din depozit care au fost confirmate între versiunea dvs. de lucru și HEAD. Este posibil să fie nevoie să rezolvați conflictele, dar veți rămâne apoi cu un fișier de lucru normal „Modificat local” care este la versiunea din depozit și care poate să trimită modificări în mod normal. –  > Por biomiker.
  • Nu pot să cred că nu există o opțiune pentru a reveni la o etichetă anterioară fără a fi lipită. În cazul meu, am actualizat un proiect la HEAD. Dar are bug-uri. Așa că vreau să revin pe câteva fișiere la un tag anterior pentru a face să funcționeze. Dar nu vreau să-mi amintesc că există etichete lipicioase care nu vor fi actualizate. Vreau să mi se reamintească faptul că există modificări în așteptare data viitoare când îmi sincronizez proiectul. –  > Por Florian F.
rdb

Puteți folosi opțiunea -p din „cvs up” pentru a scrie pe ieșirea standard, pe care o puteți redirecționa către fișierul original folosind „>”. Astfel se evită lipirea.

Comentarii

  • Acest lucru funcționează, dar vă lasă cu o stare de „Modificat local”. Dacă doriți să actualizați mai târziu, va trebui să tratați din nou acest fișier în mod special. –  > Por biomiker.
Jean Waghetti

Sau invers: Există vreo modalitate de a actualiza un director complet la o dată anterioară fără a seta etichete lipicioase în primul rând?

Eticheta lipicioasă este acolo pentru a vă aminti că nu sunteți în HEAD. Dacă trimiteți modificări, acestea nu vor ajunge acolo atunci. Iar simpla eliminare a etichetei lipicioase ar putea fi periculoasă în situații normale.

Cred că cea mai bună metodă este să creați un patch de la data la care depozitele au fost sincronizate cu o copie actualizată. Apoi aplicați patch-ul inversat. Creați un patch cu modificările modificate și aplicați-l pe celălalt depozit.

Pe un repo curat (dar nu sincronizat):

$ cvs diff -R -D date_when_synced >patchfile

$ patch -R -pNUM <patchfile

Apoi, în repo-ul în care ați făcut modificările pe care nu doriți să le pierdeți cu cvs up -A:

$ cvs diff -R >patchfile2

Apoi aplicați patch-ul în depozitul „curat”:

$ patch -pNUM <patchfile2

Cred că acest lucru ar putea face ceea ce doriți, dacă am înțeles corect.

Tags: