Utiliser Git pour travailler sur un dépot CVS
Git est le système de gestion de version le plus utilisé au monde, mais peut-être avez-vous eu la malchance de tomber sur un vieux système qui utilise encore cvs (horreur).
Ô joie ! J'ai finalement réussi à trouver une méthode à peu près potable pour travailler avec git sur un dépot CVS. C'est loin d'être la panacée, mais c'est mieux que rien. Suivez le guide.
Première étape : installer le paquet git-cvs. Si vous utilisez un système de paquet digne de ce nom, il vous installera toutes les dépendances nécessaires, dont cvsps.
# Sur ubuntu
sudo apt-get install git-cvs
Ensuite, on va créer deux dépots (oui, c'est naze, mais je n'ai pas trouvé mieux), un cvs et un git :
# racine du projet
mkdir projet && cd projet
export CVSROOT=...
cvs login
cvs checkout -d cvs
git cvsimport -C git -a -k -v -m -p -Z,9
Vous voulez savoir ce que signifient toutes ces belles options ? Facile :
man git-cvsimport
Vous allez vous retrouver avec deux répertoires : cvs contient le dépot CVS (normal), et git contient le dépot git (facile). Ça va, les neurones ne chauffent pas trop ?
Bon, on va se placer dans le dépot git.
cd git
Bien entendu, on ne va pas développer directement sur la branche master, n'est-ce pas ?
git branch
# * master
git checkout -b dev
# Switched to a new branch "dev"
# dev dev dev
git add ...
git commit
On se retrouve alors avec plusieurs commit, qu'on voudrait reporter sur le dépot CVS. (Note : Vous aurez beaucoup moins de problème si la branch dev est propre. Si vous avez des modifs en cours, utilisez git stash
.
Ça va se faire en plusieurs étapes :
# 1- On retourne sur la branche master, pour la synchroniser avec le cvs
git checkout master
cd ..
ls
# cvs git
# 2- On répète la commande d'import, qui cette fois va effectuer un update
git cvsimport -C git -a -k -v -m -p -Z,9
cd git
# 3- On merge les modifs de la branche de dev
git merge --squash dev
# Le squash permet de grouper tous les commits de la branche de dev en un seul gros commit.
# Ça sera plus pratique et plus propre pour exporter vers le dépot CVS.
# 4- On retourne dans le dépot CVS, pour le mettre a jour
cd ../cvs
cvs update
# 5- Pour reporter les modifs, on a besoin d'indiquer où est le dépot git
export GIT_DIR="/chemin/vers/projet/git/.git"
# 6- On insere les devs dans le dépot CVS
git cvsexportcommit -v
# Ou est le hash du commit que vous voulez reporter
# Cette commande va générer un patch à partir du dépot git, et l'appliquer au dépot CVS
# À ce stade, vos dépots locaux cvs et git sont équivalents
# 7- Il reste à reporter les modifs sur le serveur CVS
cvs commit
Et voilà. Je sais, la procédure est loin d'être évidente. À vrai dire, je serai heureux de découvrir qu'il existe un moyen de faire plus simple. Si quelqu'un trouve mieux, je suis preneur.
En attendant, amusez vous bien avec git.