Copier des fichiers d’un dépôt à l’autre en conservant l’historique Git

Pour inclure de manière élégante une partie des travaux d’un autre dans un de mes dépôts Git, j’ai chercher plusieurs méthodes.

Après avoir chercher du côté de submodule et de subtree, j’ai finalement décidé de récupérer à la main les fichiers qui m’intéressent (dont le fichier LICENSE 😉) ainsi que leur historique Git et de les placer dans un sous-répertoire de mon dépôt.

Voici comment j’ai procédé.

Préparer les fichiers du dépôt A

Cloner le dépôt contenant les fichiers à récupérer :

git clone URL_DEPOT_A depot_a
cd depot_a

Pour éviter de pousser malencontreusement notre ménage de printemps, supprimer le lien avec le dépôt d’origine :

git remote rm origin

La commande git filter-repo va nous permettre de conserver uniquement le‣s fichier‣s ou le‣s répertoire‣s qui nous intéresse‣nt.

# Installer git-filter-repo
apt install git-filter-repo
# Pour ne conserver qu'un fichier :
git filter-repo --force --path fichier.txt
# Pour ne conserver qu'un répertoire :
git filter-repo --force --subdirectory-filter path/to/dir

Supprimer toutes les données et les fichiers non désirés :

git reset --hard
git gc --aggressive 
git prune
git clean -fd

Déplacer les fichiers et répertoires restant dans un sous-répertoire qui prendra place dans le dépôt B et commiter ce changement :

mkdir sous-rep
git mv * sous-rep
git commit -m 'move to a subdir'

Fusionner les fichiers dans le dépôt B

Au même niveau que le dépôt A, cloner le dépôt B :

git clone URL_DEPOT_B depot_b
cd depot_b

Créer une branche qui aura pour source le répertoire du dépôt A :

git remote add depot_a ../depot_a/

Récupérer l’historique et les fichiers du dépôt A :

git pull depot_a master --allow-unrelated-histories

Réécrire l’historique en incluant les commits du dépôt A :

git rebase -i --root

Vous pouvez maintenant supprimer le lien avec le dépôt A :

git remote rm depot_a

Et enfin, émettre vos modifications :

git push

Et voilà ! Vous pouvez supprimer le dépôt A qui ne vous est d’aucune utilité !


Sources :

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.