Comment puis-je revenir un grand changement dans le CVS?
Un de mes collègues a totalement foiré le contenu d'un répertoire dans nos principaux référentiel CVS. J'ai juste besoin de revenir l'ensemble du module à l'état où il était à la fin de l'année dernière. Quelle est la commande CVS pour ce faire, s'il vous plaît?
Il a ajouté et enlevé des centaines de fichiers, de sorte qu'un simple "copier des fichiers à partir de vieux de la caisse et de s'engager" n'est pas suffisant.
J'ai RTFM et STFW, et j'ai essayé ceci:
cvs co modulename # Note no -P option
cvs up -jHEAD -jMAIN:2008-12-30 modulename
Mais cela ne fonctionne pas les fichiers qu'il a créé sont supprimés, mais les anciens fichiers et répertoires n'obtenez pas ressuscité. (Je n'ai pas commettre).
Je peux probablement écrire un script shell pour cela, mais sûrement, cette fonctionnalité doit être dans le CVS déjà?
Mise à jour: Quelques précisions:
-
Je peux obtenir un local de la caisse du module à une date précise. La question est de savoir comment obtenir ce retour dans le CVS.
-
J'ai des sauvegardes, mais le point à l'aide d'un système de gestion de versions tels que CVS, c'est que c'est censé être facile d'obtenir tout l'historique de l'état. La prochaine fois, quelque chose comme cela arrive, je ne peut pas être la chance d'avoir des sauvegardes (par exemple, les sauvegardes quotidiennes, afin que je puisse perdre une journée de travail).
-
Je sais que CVS est vieux, et qu'il faut passer à quelque chose de plus récent. Mais dans une grande équipe avec un grand nombre de CVS des outils basés sur la (caisse & scripts de construction, nightly build server, etc), le coût d'une telle évolution est considérable. (L'évaluation, la mise à jour des scripts, des essais, de la migration, la formation, la perte de temps dans le révélateur, le maintien de deux systèmes en parallèle comme CVS serait encore nécessaire pour les anciennes branches). Donc ce doit être planifiée & prévue par la direction.
Mise à jour #2: je vais commencer une prime sur ce. Pour se qualifier pour la générosité que vous avez à expliquer comment faire pour revenir à l'aide de la normale commandes CVS, non pas avec un hacky script shell.
Mise à jour #3: Le serveur est CVS 1.12.13. L'accès se fait par pserver. Je peux utiliser la même version de CVS sur un PC sous Linux, ou le CVSNT 2.0.51 d client sur Windows.
- Je ne veux pas être impoli, mais vous avez des sauvegardes, droit?
- Je ne pense pas que ce soit une sauvegarde problème, c'est que la source de contrôle est conçu pour. Bien que, je suis d'accord que l'opération devrait avoir des sauvegardes, tout simplement pas pour cette.
- Oui, nous avons des sauvegardes. La pensée de faire une restauration a eu lieu pour moi, trop. J'avais (bêtement) à penser qu'un CV revenir serait plus facile.
- Quelle version CVS serait-ce sur? Je pense que le plus récent cvs versions avec patchset soutien serait capable de faire cela assez facilement...
Vous devez vous connecter pour publier un commentaire.
Fait votre approche initiale était très proche de la solution. Le problème est, que de se joindre à ce jour-ne pas manipuler supprimé des fichiers et des répertoires correctement. Vous devez définir une balise dans le code de base que vous souhaitez adhérer à la première:
Maintenant faire la jointure à base de balises, en soustrayant tous les changements entre maintenant et 2008-12-30:
Comparer le contenu de code_base1 et code_base2. Ils devraient être identiques, sauf pour les CVS des méta-informations. Enfin commettre le code tel qu'il était sur le 2008-12-30 en tant que nouvelle CHEF:
Noter que le marquage du code que vous souhaitez rejoindre, cela ne fonctionne pas, parce que rtag aussi ne gère pas supprimé des fichiers et des répertoires correctement, lors de l'utilisation -D:
Il y a plusieurs problèmes avec CV et vous êtes à la frapper avec un tel problème.
CVS est fichier-orienté, pas de concept d'un ensemble de modifications ou snasphot. Cela signifie que des changements tels que celui que vous voulez revenir un peu difficile à manipuler. Les Commits sont atomiques à l'intérieur d'un répertoire donné, non pas à l'extérieur.
Répertoires ne sont pas versionnés. Cela signifie que les répertoires vides seront supprimés (si vous mettez à jour avec
-P
) et que vous ayez à préciser-d
pour les créer à la caisse/mise à jour.Donc, pour répondre à votre question, les dates sont probablement la seule façon de traiter avec parce que vous n'avez pas à utiliser des tags pour créer une pauvre version de l'homme de l'ensemble de modifications.
Mon commentaire sur les sauvegardes, il peut être plus facile de récupérer l'ensemble des pensions de partir de sauvegardes que d'essayer de corriger les choses que CVS n'est pas vraiment bon.
Je voudrais vous encourager, mais c'est un autre sujet -- de changement de contrôle de version dès que vous le pouvez. Faites-moi confiance, j'ai du faire avec CVS pour un long temps à l'intérieur de la Projet FreeBSD et apprenez très vite haineux CVS est... Voir ici pour certains de mes points de vue sur le logiciel de contrôle de version.
Je crois que votre deuxième commande doit également être une caisse, plutôt que d'une mise à jour. Je ne peux pas justifier ce avec la logique, puisqu'il n'y a pas de logique dans le monde de CVS, mais il a travaillé pour moi. Essayez ceci:
Si vous êtes le retour d'une branche autre que la TÊTE, par exemple X, passer l'-rX argument dans les deux commandes:
Je suis toujours intéressé de savoir si il ya un moyen plus facile. (Il doit y avoir certainement un moyen plus facile). Ce que j'ai fait a été, sur un PC sous Linux à l'aide de bash:
Puis j'ai découvert qu'il y avait encore des différences - mon collègue a ajouté les noms de fichiers contenant des espaces, qui n'ont pas été supprimés par le processus ci-dessus. J'ai dû supprimer séparément. (J'aurais utilisé
find ... -print0
plutôt que-print
, et passé le-0
argumentxargs
. Je n'avais pas réalisé qu'il y avait des fichiers avec des espaces.)Vous pourriez regarder dans cvsps. Une recherche sur Google.
Aussi, avec couette (ou Andrew Morton patchscripts, qui est ce quilt a commencé comme) et cvsps, un très proche rapprochement des révisions peut être eu.
voir http://geocities.com/smcameron/cvs_changesets.html
Avez-vous essayé d'utiliser le
-d
option? (créer des sous-répertoires)Aussi loin que je me souvienne, c'est implicite pour les
cvs co
, mais pas pourcvs up
.Selon http://www.astro.ku.dk/~aake/MHD/docs/CVS.html, la suivante est ce que vous avez besoin de:
Gros problème, n'ont pas de réponse, juste un conseil sur votre script à traiter avec des espaces dans les noms de fichier.
Au lieu de
essayer de mettre
de cette façon, vos archives la création (ou opérations similaires) ne souffre pas d'espaces dans les noms, la coquille argv l'analyse a sauté avant le goudron est appelé.
Une chose de plus, sur le de chances que ça marche vraiment: si il y a un CVS vers SVN utilitaire, de l'utiliser (je suis en supposant une telle utilité serait de tirer des fichiers supprimés à partir de la "CVS grenier"), et si il enregistre chaque moment dans le temps, dans un projet de niveau de point de contrôle (depuis le SVN n'est que, contrairement à CVS), l'utilisation de SVN pour récupérer le bon moment dans le temps. Beaucoup de si...
Si vous ou un collègue sont à l'aise avec git, vous pouvez utiliser
git cvsimport
pour créer un dépôt git de mise en miroir du serveur CVS. Le rétablissement d'un commit/révision dans git est trivial (à l'aide degit revert
). Vous pouvez ensuite utilisergit cvsexportcommit
pour envoyer le revert de s'engager à CVS.Ceci peut sembler trop compliqué, mais dans mon expérience
git cvsimport
etgit cvsexportcommit
marche vraiment bien, une fois que vous avez tout mis en place. Vous vous retrouvez avec toute la puissance de git personnellement, même si le projet est encore à l'aide de CVS.Si vous avez une sauvegarde de votre dépôt (le RCS fichiers sur le serveur, par exemple sur la bande), vous pouvez simplement restaurer le dossier sur le serveur CVS de l'état où il était avant. N'oubliez pas d'arrêter le serveur CVS avant de le faire (et de le redémarrer par la suite).