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.