74 votes

Exportation de sous-arbres dans Git avec historique

J'ai un dossier dans mon dépôt Git que j'aimerais déplacer dans son propre dépôt. Est-il possible de déplacer l'historique de ce dossier en même temps que le dossier ?

Auparavant, je faisais juste un git rm -r --cached subfolder/ et ensuite git init sur le sous-dossier. Cependant, l'historique n'est pas importé dans le nouveau référentiel.

2 votes

Similaire à, ou duplicata de : stackoverflow.com/questions/811251/

104voto

jamessan Points 16420

Citant un exemple de git-filter-branch(1)

Réécrire le dépôt pour qu'il ait l'air d'avoir été la racine du projet foodir/, et supprimer tout autre historique :

git filter-branch --subdirectory-filter foodir -- --all

Ainsi, vous pouvez, par exemple, transformer un sous-répertoire de bibliothèque en un dépôt à part entière. Notez le -- qui sépare les options de filtre-branche des options de révision, et le --all pour réécrire toutes les branches et balises.

50 votes

Assurez-vous d'exécuter cette opération sur un clone du dépôt d'origine, car elle efface le reste du dépôt.

0 votes

Incroyable ! Je ne pouvais pas comprendre cette option sans un exemple concret. Merci !

0 votes

Merci aussi à @bobDevil pour l'info. J'ai poussé tous mes changements vers mon dépôt distant /avant/ d'essayer ceci, donc je serais en sécurité si cela effaçait mon dépôt ; mais ce serait certainement inattendu.

12voto

Jamie Cook Points 1669

Pour tous ceux qui arriveront ici en 2021 (ou plus tard), git filter-branch n'est pas fortement recommandé par l'équipe centrale de git.

AVERTISSEMENT git filter-branch a une pléthore de pièges qui peuvent produire des manipulations non évidentes de la réécriture de l'historique prévue (et peut vous laisser peu de temps pour enquêter sur de tels problèmes puisqu'il a des performances si abyssales). Ces problèmes de sécurité et de performance ne peuvent pas être corrigés de manière rétrocompatible et, en tant que tel, son utilisation n'est pas recommandée. Veuillez utiliser un outil alternatif de filtrage de l'historique tel que git filter-repo. Si vous avez encore besoin d'utiliser git filter-branch, veuillez lire attentivement SAFETY (et PERFORMANCE) pour connaître les mines terrestres de filter-branch, puis évitez avec vigilance le plus grand nombre possible des dangers qui y sont énumérés.

L'outil recommandé est plutôt git-filtre-repo qui permet de résoudre facilement ce problème

git filter-repo --path subfolder/   # Filter the repo to just the sub-dir
git mv subfolder/* .                # Move the contents of the sub-dir to the root
git commit -m "Filtered from main repo"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X