Git est un gestionnaire de source distribué. Il s’impose désormais comme le standard de fait dans bon nombre de projet (que ce soit libre ou propriétaire). Ce succès est dû en grande partie à sa flexibilité qui permet de l’adapter à de nombreux contextes, modèles ou workflow de collaboration.

Contexte

J’ai découvert récemment une nouvelle fonction de Git qui permet de ré-écrire l’historique d’un projet afin de la séparer en plusieurs morceaux.

Pour prendre un exemple concret, imaginons que je dispose d’un dépôt Git qui contient un certain nombre de sous-répertoires. Après quelques mois d’utilisation, je me rends compte, que l’un de sous-répertoire réprésente désormais un projet à part entière et j’aimerais donc le détacher dans un dépôt séparé.

Comment puis-je faire cela tout en gardant l’historique des fichiers dans le répertoire ?

J’ai donc la structure suivante :

XYZ/
    .git/
    D1/
    D2/
    D3/

Que je souhaite transfomer vers la structure suivante :

XYZ/
    .git/
    D1/
    D2/

 D3/
    .git/

Exporter un répertoire dans un dépôt autonome

Depuis la version 1.7.11 de Git, un outil complémentaire (contrib) est disponible qui permet d’automatiser presque entièrement cette tache. Il s’agit de git subtree.

NB: Sur Debian, le script n’est pas installé par défaut, mais est cependant disponible dans /usr/share/doc/git/contrib/subtree/git-subtree.sh

Voici donc un exemple d’utilisation de git subtree :

Preparer l’ancien dépôt

# export INIT_REPO=<path-to-init-repo>
# cd ~
# cd $INIT_REPO
# git subtree split -P <dossier> -b <branche>

Attention: ne doit pas contenir de caractères slash au début ou à la fin (folder != ./folder/).

Créer le nouveau dépôt

# export NEW_REPO=<path-to-new-repo>
# cd ~
# mkdir $NEW_REPO
# cd $NEW_REPO
# git init
# git pull $BIG_REPO <branche>

Lier le nouveau dépôt à GitHub ou autre remote

# git remote add origin <git@github.com:user/repo.git>
# git push origin -u master

Nettoyage (optionel)

# cd $INIT_REPO
# git rm -rf <dossier>

Attention : cette procédure va conserver l’ensemble de l’historique dans le dépôt Git initial. Ceci ne permet donc pas directement de gagner de l’espace disque.

Bilan

Il est donc possible grace à git subtree de refactorer un dépot. La conservation de l’historique est un élément essentiel de cette méthode qui permet de repenser son ou ses projets sans perdre d’informations précieuses.

Si vous souhaitez obtenir plus d’informations sur la commande git subtree, je vous invite à consulter les liens suivants :

Comments