Fusionner deux dépôts git
Ce billet explique comment fusionner un dépôt git (avec son historique) dans un sous-répertoire d’un autre dépôt git.
Cas d’usage
Mon projet principal se trouve dans un dépôt main
. J’ai démarré dans un autre
dépôt un projet other
, que je souhaite finalement intégrer dans un
sous-répertoire sub/
du projet principal, en conservant son historique. Après
cette fusion, je ne garderai que le dépôt principal.
Fusion
Les deux projets se trouvent dans le répertoire courant :
$ ls
main other
Dans le dépôt main
, copier la branche master
de other
dans une nouvelle
branche tmp
:
Le dépôt main
contient alors les historiques disjoints des deux projets.
Nous allons maintenant réécrire l’historique complet de la branche tmp
pour
déplacer tout le contenu dans un sous-répertoire sub/
, grâce une commande
donnée en exemple de man git filter-branch
:
À ce stade, nous avons toujours deux historiques indépendants, mais le contenu
lié à la branche tmp
se trouve dans le sous-répertoire sub/
.
A---B---C---D master
X---Y---Z tmp
La dernière étape consiste à relier les deux historiques, soit grâce à un rebase, soit grâce à un merge.
Un rebase réécrit l’historique du sous-projet sur la branche master
:
Un merge relie juste les deux historiques grâce à un commit de merge :
Concrètement
J’ai débuté la réécriture du serveur relais de gnirehtet en Rust dans un dépôt séparé. Maintenant qu’il commence à fonctionner, je l’ai fusionné dans un sous-répertoire du dépôt principal tout en conservant l’historique :