Pour des raisons historiques, j'utilise CVS sur un projet. Récemment, j'ai apporté des modifications qui ont enfreint notre code et je devais les annuler. Quel est l'analogue de git revert -r <old_revision>
de CVS?
En examinant des questions antérieures telles que Comment rétablir un changement important , les commits CVS ne regroupent pas les fichiers modifiés. Est-ce la seule façon de revenir en utilisant les dates?
Aussi, quel est le meilleur moyen de voir les changements passés? Le journal CVS génère trop d’informations, dont la plupart sont inutiles. Je veux voir les messages de validation et les fichiers modifiés.
La documentation de CVS peut être trouvée ici , mais à partir de ce site il explique comment restaurer un seul fichier:
FAIRE DE LA VIEILLE VERSION LA VERSION ACTUELLE
Enregistrez la version de "oldfile" sur quelque chose d'autre et vérifiez la version "actuelle".
Remarque: vous devez toujours mettre à jour -A pour obtenir la version actuelle, car même si vous avez renommé
"oldfile" la balise est toujours associée au fichier "oldfile" et n'est pas supprimée tant que> update -A n'est pas terminé.Puis renommez la "vieille" version en "actuelle".
% mv oldfile oldfile.old.ver
% cvs update -A oldfile
% mv oldfile.old.ver oldfile
% cvs commit -m "en revenant à la version 1.5" oldfileVous pouvez maintenant continuer à extraire, éditer et valider le fichier normalement.
Cela ne gérera pas beaucoup de fichiers de manière récursive, mais cela aide, espérons-le.
Pour sauvegarder une révision d'un seul fichier, utilisez cvs admin -o
.
Consultez la documentation de CVS (info cvs
si vous utilisez un système de type Unix) pour plus de détails, ou consultez ce lien .
Citant le manuel:
`-oRANGE'
Deletes ("outdates") the revisions given by RANGE.
Note that this command can be quite dangerous unless you know
_exactly_ what you are doing (for example see the warnings below
about how the REV1:REV2 syntax is confusing).
If you are short on disc this option might help you. But think
twice before using it--there is no way short of restoring the
latest backup to undo this command! If you delete different
revisions than you planned, either due to carelessness or (heaven
forbid) a CVS bug, there is no opportunity to correct the error
before the revisions are deleted. It probably would be a good
idea to experiment on a copy of the repository first.
Il propose ensuite plusieurs manières de spécifier une révision ou une plage de révisions à supprimer.
Comme il est dit, cela peut être assez dangereux; il efface les informations du référentiel, ce qui correspond généralement à ce que tout système de contrôle de révision tente d'empêcher.
Si vous n'avez pas besoin de modifier l'historique de cette façon, il vous suffit de récupérer une copie de l'ancienne version et de l'enregistrer au-dessus de la mauvaise révision, comme le suggère la réponse de Dave M.
Et vous avez raison, CVS met l'accent sur des fichiers individuels; les systèmes plus modernes ont tendance à mettre l’accent sur l’état de l’ensemble du référentiel.
Jusqu'à présent, tout cela ne vous permet de traiter qu'un fichier à la fois.
Mais vous pouvez extraire un module entier à une date spécifiée dans un répertoire séparé (cvs checkout -D date
), puis copier les fichiers sur votre copie actuelle du module et archiver tout le contenu. Si vous le faites, assurez-vous de faire un "cvs diff "afin que vous sachiez exactement quels changements vous apportez.
Je ne connais pas un bon moyen d'obtenir des informations de journal plus concises. cvs log
sans argument vous donne un journal pour chaque fichier, pas par ordre chronologique. cvs log filename
vous donne un journal pour un fichier spécifié, mais ne le relie pas à d'autres fichiers pouvant avoir été modifiés en même temps. Personnellement, je pourrais envisager d’écrire un script Perl qui rassemble les informations imprimées par cvs log
et les réorganise pour les afficher, mais c’est probablement plus de travail que ce qui vous intéresse.
Il existe des outils pour importer des référentiels CVS dans quelque chose de plus moderne.
Voici les commandes.
1) faux commettre arriver
2) vérifier sa dernière version.
cvs log file.txt
disons que 1.25 est la dernière version en raison d'un faux commit, nous voulons donc revenir à l'ancienne version 1.24.
3) Alors allons-y comme ci-dessous.
cvs update -r 1.24 file.txt // checkout older version
cp file.txt old.txt // create backup
cvs update -A file.txt // again move to latest one
cp old.txt file.txt // replace old to at latest one.
cvs status file.txt // It will shows as locally modified.
cvs commit -m "Reverting false commit" file.txt
cvs log file.txt // new 1.26 will be created.
4) Juste pour s'assurer que diff que 1.26 et 1.24 sont identiques.
cvs diff -r 1.26 -r 1.24 file.txt
Si toutes les étapes ci-dessus sont correctes, diff ne présentera aucune différence.
Avec deux options -j, CVS fusionnera les modifications entre les deux révisions respectives.
Exemple:
Si le fichier @file {foo.c} est basé sur la révision 1.6 et que vous souhaitez supprimer les modifications apportées entre les versions 1.3 et 1.5, vous pouvez procéder comme suit:
$ cvs update -j1.5 -j1.3 foo.c # note the order...
En plus de revenir par date, vous pouvez revenir par étiquette si l'ensemble des fichiers sur lesquels vous souhaitez revenir est étiqueté.
J'ai eu ce que je pense est une situation similaire et j'ai fait ce qui suit qui affecte l'ensemble du dossier plutôt que fichier par fichier:
Cette approche nécessitera une modification si des fichiers ont été ajoutés/supprimés entre l'ancienne version et la version actuelle.
L'historique du CVS indiquera la réversion.