Je vais travailler avec d'autres personnes sur le code d'un projet qui utilise cvs. Nous voulons utiliser un vcs distribué pour faire notre travail et quand nous avons terminé ou peut-être de temps en temps, nous voulons valider notre code et tout notre historique de révision dans cvs. Nous n'avons pas d'accès en écriture au dépôt cvs du projet, nous ne pouvons donc pas nous engager très fréquemment. Quel outil pouvons-nous utiliser pour exporter notre historique de révision vers des cvs? Actuellement, nous pensions utiliser git ou mercurial mais nous pourrions utiliser un autre vcs distribué si cela pouvait faciliter l'exportation.
100
Réponses:
Heureusement pour ceux d'entre nous qui sont encore obligés d'utiliser CVS, git fournit de très bons outils pour faire exactement ce que vous voulez faire. Mes suggestions (et ce que nous faisons ici à $ work):
Création du clone initial
Utilisez
git cvsimport
pour cloner l'historique des révisions CVS dans un référentiel git. J'utilise l'invocation suivante:L'
-A
option est facultative, mais elle permet de donner à votre historique des révisions importé de CVS un aspect plus git (voirman git-cvsimport
pour plus d'informations sur la configuration).Selon la taille et l'historique du référentiel CVS, cette première importation prendra TRES longtemps. Vous pouvez ajouter un -v à la commande ci-dessus si vous voulez avoir la tranquillité d'esprit que quelque chose se passe réellement.
Une fois ce processus terminé, vous aurez une
master
branche qui devrait refléter HEAD de CVS (à l'exception quegit cvsimport
par défaut ignore les 10 dernières minutes de commits pour éviter d'attraper un commit à moitié terminé). Vous pouvez ensuite utilisergit log
et friends pour examiner l'historique entier du référentiel comme s'il utilisait git depuis le début.Ajustements de configuration
Il y a quelques ajustements de configuration qui faciliteront les importations incrémentielles de CVS (ainsi que les exportations) à l'avenir. Ceux-ci ne sont pas documentés sur la
git cvsimport
page de manuel, donc je suppose qu'ils pourraient changer sans préavis mais, FWIW:Toutes ces options peuvent être spécifiées sur la ligne de commande afin que vous puissiez ignorer cette étape en toute sécurité.
Importations incrémentielles
La suite
git cvsimport
devrait être beaucoup plus rapide que la première invocation. Cependant, il effectue uncvs rlog
sur chaque répertoire (même ceux qui ne contiennent que des fichiersAttic
), cela peut donc prendre quelques minutes. Si vous avez spécifié les configurations suggérées ci-dessus, tout ce que vous avez à faire est d'exécuter:Si vous n'avez pas configuré vos configurations pour spécifier les valeurs par défaut, vous devrez les spécifier sur la ligne de commande:
Quoi qu'il en soit, deux choses à garder à l'esprit:
cvsimport
qui prendra à nouveau une éternité.master
branche afin que les modifications puissent être fusionnées (ou rebasées) dans vos branches locales / thématiques.Faire des changements locaux
En pratique, je recommande de toujours apporter des modifications sur les branches et de ne fusionner que
master
lorsque vous êtes prêt à exporter ces modifications vers le référentiel CVS. Vous pouvez utiliser le workflow de votre choix sur vos branches (fusion, rebasage, écrasement, etc.) mais bien sûr, les règles de rebasage standard s'appliquent: ne rebasez pas si quelqu'un d'autre a basé ses modifications sur votre branche.Exportation des modifications vers CVS
La
git cvsexportcommit
commande vous permet d'exporter un seul commit vers le serveur CVS. Vous pouvez spécifier un seul ID de validation (ou tout ce qui décrit une validation spécifique telle que définie dansman git-rev-parse
). Un diff est ensuite généré, appliqué à une extraction CVS puis (éventuellement) validé dans CVS en utilisant lecvs
client réel . Vous pouvez exporter chaque micro-commit sur vos branches thématiques, mais en général, j'aime créer un commit de fusion sur un commit à jourmaster
et exporter ce commit de fusion unique vers CVS. Lorsque vous exportez un commit de fusion, vous devez indiquer à git quel parent de commit utiliser pour générer le diff. De plus, cela ne fonctionnera pas si votre fusion était une avance rapide (voir la section "COMMENT FONCTIONNE LA FUSION"man git-merge
pour une description d'une fusion à avance rapide). Vous devez donc utiliser le--no-ff
option lors de l'exécution de la fusion. Voici un exemple:Vous pouvez voir la signification de chacune de ces options sur la page de manuel de git-cvsexportcommit . Vous avez la possibilité de définir l'
-w
option dans votre configuration git:Si le correctif échoue pour une raison quelconque, mon expérience est que vous ferez probablement (malheureusement) mieux de copier les fichiers modifiés manuellement et de les valider à l'aide du client cvs. Cependant, cela ne devrait pas se produire si vous vous assurez que
master
CVS est à jour avant de fusionner votre branche thématique.Si la validation échoue pour une raison quelconque (problèmes de réseau / autorisations, etc.), vous pouvez prendre la commande imprimée sur votre terminal à la fin de la sortie d'erreur et l'exécuter dans votre répertoire de travail CVS. Cela ressemble généralement à ceci:
La prochaine fois que vous effectuez un
git cvsimport
(attendre au moins 10 minutes), vous devriez voir le correctif de votre commit exporté réimporté dans votre référentiel local. Ils auront des ID de commit différents puisque le commit CVS aura un horodatage différent et éventuellement un nom de committer différent (selon que vous avez configuré un fichier auteurs dans votre initialecvsimport
ci-dessus).Cloner votre clone CVS
Si vous avez plus d'une personne devant faire le
cvsimport
, il serait plus efficace d'avoir un seul référentiel git qui effectue le cvsimport et que tous les autres référentiels soient créés en tant que clone. Cela fonctionne parfaitement et le référentiel cloné peut effectuer des commandes cvsexport comme décrit ci-dessus. Il existe cependant une réserve. En raison de la manière dont les validations CVS reviennent avec différents ID de validation (comme décrit ci-dessus), vous ne voulez pas que votre branche clonée suive le référentiel git central. Par défaut, voici commentgit clone
configurer votre référentiel, mais cela est facilement résolu:Après avoir supprimé ces configurations, vous devrez explicitement dire où et quoi extraire lorsque vous souhaitez extraire de nouveaux commits depuis le référentiel central:
Dans l'ensemble, j'ai trouvé que ce flux de travail était assez gérable et que la "prochaine meilleure chose" lors d'une migration complète vers git n'est pas pratique.
la source
git cvsimport
sur Debian, essayezapt-get install git-cvs
Initialized empty Git repository in /Users/gus/projects/foo/foobar/.git/ Can't exec "cvsps": No such file or directory at /Applications/Xcode.app/Contents/Developer/usr/libexec/git-core/git-cvsimport line 777. Could not start cvsps: No such file or directory git cvsimport: fatal: cvsps reported error
Donc, malheureusement, cela ne vous permet pas de contourner l'absence de CVS :(Vous ne devez pas faire confiance aveuglément à cvsimport et vérifier si l'arborescence importée correspond à ce qui se trouve dans le dépôt CVS. J'ai fait cela en partageant le nouveau projet en utilisant le plug-in eclipse CVS et j'ai constaté qu'il y avait des incohérences.
Deux validations qui ont été effectuées en moins d'une minute avec le même message de validation (afin de restaurer un fichier supprimé à tort) ont été regroupées en une seule grande validation, ce qui a entraîné un fichier manquant dans l'arborescence.
J'ai pu résoudre ce problème en modifiant le paramètre «fuzz» à moins d'une minute.
exemple:
ligne du bas: vérifiez votre arbre après l'importation
la source
En plus de la réponse de Brian Phillips: il y a aussi git-cvsserver qui fonctionne comme le serveur CVS mais qui accède en fait au référentiel git ... mais il a quelques limitations.
la source