Utiliser git pour travailler sur un dépôt subversion

J'ai de plus en plus de mal à utiliser directement subversion mais certains des projets sur lequel je travaille sont gérés avec subversion. Voici une façon de travailler sur ces projets en utilisant git.

Tous les exemples qui suivent se basent sur le dépôt subversion du projet piwigo hébergé par gna. La première chose à faire est de faire une copie du dépôt subversion. Attention cela peut durer longtemps si le projet a un long historique :

git-svn clone svn+ssh://nikrou@svn.gna.org/svn/phpwebgallery -T trunk -b branches -t tags

Imaginons que je travaille sur une nouvelle fonctionnalité (feature 654). Je vais créer une nouvelle branche pour cela:

git checkout -b feature_654

e fais mon développement normalement en faisant des modifications, des ajouts, des suppressions. Je sauvegarde (commit) de temps en temps,... tout cela en local. J'ai un historique de tout ce que j'ai fait pour développer cette nouvelle fonctionnalité.

Exemple :
modification de include/mon_fichier.php
ajout de test.php :

git add include/mon_fichier.php test.php
git commit -m 'commit intermédiaire'

Lorsque j'estime que ce que j'ai fait peut être publié, je retourne sur le tronc (master) pour faire ajouter la nouvelle fonctionnalité :

git checkout master

(retour sur le tronc, branche master)

git merge --no-commit --squash feature_654

L'attribut "no-commit" permet de vérifier et éventuellement faire des modifications, avant de commit réellement sur le dépôt subversion. L'attribut "squash" permet de regrouper tous les commit que l'on a fait sur la branche de développement en un seul commit que l'on va faire sur le dépôt central.

Je peux voir tous les fichiers ajoutés/modifiés/supprimés liés à la nouvelle fonctionnalité. Je les sélectionne (git add) pour les mettre dans l'index et je sauvegarde (git commit) en mettant un message qui cette fois sera repoussé sur le serveur subversion.
Pour propager cette fonctionnalité sur le dépôt central, je regarde l'historique (git log) et je repère le commit que je viens de faire lié à la nouvelle fonctionnalité que je vais ajouter. Je note le hash sur la ligne commençant par commit :
Exemple :
5c4d674cd0e68eb607aa7808301aac2f8cfdd1a8

Il ne reste plus qu'à propager sur le serveur central :

git-svn dcommit 5c4d674cd0e68eb607aa7808301aac2f8cfdd1a8

Haut de page