web-dev-qa-db-fra.com

Comment importer et maintenir à jour un référentiel CVS dans Git?

Il existe un référentiel central dans CVS, et je voudrais l'utiliser localement avec Git, puis renvoyer mes modifications à CVS.

Que puis-je accomplir quotidiennement?

Les tâches que j'aimerais accomplir sont:

  • importation de succursales,
  • obtenir l'historique au format GIT, et
  • exporter mes modifications/validations vers le serveur centralisé

BTW, j'ai également regardé Meilleures pratiques pour utiliser git avec CVS . Mais cela n'a pas fonctionné et je n'ai pas pu comprendre ce que j'ai raté ou fait de mal.

35
Jatin Ganhotra

Ce que j'ai fait dans le passé, c'est:

Importez le référentiel CVS

En utilisant:

$ git cvsimport -C target-cvs -r cvs -k -vA authors-file.txt -d $CVSROOT module

Où:

  • target-cvs est le répertoire pour conserver ma copie locale du référentiel.
  • cvs est le nom à utiliser pour référencer le référentiel distant. Donc, j'aurai cvs/master, cvs/HEAD, etc. pointé localement par master.
  • authors-file.txt est le fichier qui contient les correspondances entre le compte CVS et Nom + e-mail, chaque ligne contient userid=User Name <useremail@hostname>
  • $CVSROOT est le serveur de dépôt CVS. Si j'utilise un clonage anonyme à partir d'un référentiel sourceforge, j'utiliserais alors: :pserver:anonymous@project_name.cvs.sourceforge.net:/cvsroot/project_name
  • module est le module à l'intérieur du référentiel que je veux cloner. Si le référentiel n'a qu'un seul module, il sera probablement identique à project_name.

Mettre à jour le référentiel

Il est possible de répéter la commande que j'ai écrite précédemment. Dans cet exemple particulier, il doit être exécuté dans le répertoire parent de target-cvs. Pour vous faciliter la tâche à l'avenir, vous souhaiterez peut-être configurer certaines variables (vous pouvez lire plus de détails dans la réponse de " Comment exporter l'historique des révisions de Mercurial ou git vers cvs ? ")

$ git cvsimport

Cela suffirait à garder le référentiel local dans git synchronisé avec le référentiel distant dans CVS.

Travail quotidien

Dorénavant, chaque changement devrait aller dans une branche git locale. Une fonctionnalité, une branche. Pour cela, j'utilise un flux de travail décrit dans "n modèle de branchement Git réussi". La seule différence est que master pointe vers CVS, mais conceptuellement, les mêmes flux de travail peuvent être appliqués ici. Ce n'est qu'une convention.

Une fois que votre commit est poussé dans CVS, il sera de nouveau maître dans la prochaine mise à jour (git cvsimport). Ensuite, vous pouvez supprimer la branche locale qui a implémenté cette fonctionnalité.

Pour les travaux en cours (dans les succursales locales), vous devez rebase contre maître. Étant donné que les fonctionnalités sont séparées, il devrait être plus facile de résoudre les conflits. La partie délicate est lorsque certaines branches dépendent d'autres, mais toujours gérables. Micro commits aide beaucoup (comme dans tout flux de travail git).

Si chaque branche locale est rebasée et que le maître n'est jamais touché (sauf pour les mises à jour), alors git cvsexportcommit devrait simplement fonctionner. N'oubliez pas, cela fonctionne pour un commit. C'est un peu fastidieux, mais c'est mieux que rien. Étant donné l'exemple précédent, la commande devrait ressembler à ceci:

$ git cvsexportcommit -vc commit-id

Si vous ne disposez que d'un accès en lecture seule au CVS distant, vous pouvez envoyer les correctifs par e-mail ou rendre votre référentiel git public, afin que les valideurs puissent récupérer vos correctifs pour les appliquer. Rien de différent d'un flux de travail normal de CVS dans ce cas. Encore une fois, dans la prochaine mise à jour, vous verrez les changements dans master .

47
gpoo

Avec la version récente git cvsimport est cassé à cause de cvspsincompatibilité d'outil .

Vous devez donc installer cvsps-2.1.

Sous OSX, vous pouvez (avoir brew):

brew tap homebrew/versions
brew install cvsps2
brew unlink cvsps
brew link --overwrite cvsps2

Et importez sur le référentiel git vide comme d'habitude, par exemple:

git cvsimport -C RepoName -r cvs -o master -k -v -d:pserver:[email protected]:/cvsroot/path ModuleName

Vous pouvez aussi utiliser cvs2git outil qui peut convertir un dépôt CVS en git. Cependant, vous devez avoir accès à un répertoire CVSROOT.

Vérifiez documentation cvs2git pour les étapes d'installation.

Exemple d'utilisation:

cvs2git --blobfile=git-blob.dat --dumpfile=git-dump.dat --username=cvs2git /path/to/cvs/repo

Cela créerait deux fichiers de sortie au format d'importation rapide git. Les noms de ces fichiers sont spécifiés par votre fichier d'options ou vos arguments de ligne de commande. Dans l'exemple, ces fichiers sont nommés cvs2git-tmp/git-blob.dat et cvs2git-tmp/git-dump.dat.

Ces fichiers peuvent être importés dans un référentiel git vide par:

cat git-blob.dat git-dump.dat | git fast-import

Supprimez ensuite le TAG.FIXUP branchez et exécutez gitk --all pour afficher les résultats de la conversion.

Vérifiez-en plus en exécutant: cvs2git --help.

7
kenorb

Je crois qu'il n'y a pas de recette prête à l'emploi dans votre cas. Mais, vous pouvez essayer de suivre:

  • Synchroniser manuellement les données CVS avec Git, ou écrire des scripts pour cela. Ils obtiendront des informations de CVS et les transmettront à Git. Cela vous donnera une sorte d'histoire dans Git. Pas entièrement propre, pas entièrement utilisable, mais quand même.
  • Migrez votre référentiel CVS vers Git en utilisant tools like git cvsimport. Et demandez à Git de faire semblant d'être CVS pour d'autres développeurs, en utilisant git cvsserver.
2
shytikov