Comment extraire un répertoire Git dans un autre dépôt ?

Cet article a été publié depuis plus de 6 mois, cela signifie que le contenu peut ne plus être d'actualité.

Lorsque l'on développe, nous sommes amenés à créer divers composants techniques et/ou fonctionnels afin de découper notre architecture applicative. Parfois, ces composants peuvent être utiles dans d'autres bases de code et il est alors intéressant de les extraire afin de pouvoir les réutiliser plus facilement.

Il est alors possible de créer un nouveau dépôt et de copier le ou les dossiers contenant le code du composant en question. Néanmoins, cette méthode simple présente un énorme inconvénient : le journal de commit. Effectivement, en effectuant une simple copie des fichiers, nous perdons l'historique des commits Git et donc l'historique du composant.

Heureusement Git possède tous les outils nous permettant de réaliser cette opération d'extraction tout en conservant notre historique de travail avec la commande filter-branch.

Note: pour les utilisateurs faisant ces opérations sous Windows, il est important de noter qu'il faut utiliser le séparateur *nix ('/') pour les dossiers. Sans quoi les commandes ne seront pas exécutées avec succès.

La commande filter-branch permet de réécrire l'historique Git en appliquant des filtres personnalisés. Les filtres peuvent permettre la réécrire des commits, des branches (en incluant les informations de merge), ...

Pour extraire notre composant, nous allons commencer par cloner le dépôt dans le répertoire qui contiendra notre composant :

git clone –no-hardlinks /path/to/project /path/to/component

Puis nous allons extraire les fichiers du dossier qui nous intéresse :

cd /path/to/component
git filter-branch --prune-empty --subdirectory-filter src/path/component

Et voilà, notre nouveau dépôt ne contient que les fichiers que nous souhaitions extraire. Il ne reste plus qu'à supprimer définir le nouveau remote de notre composant :

git remote remove origin
git remote add origin url/to/new/remote