Git fait un très bon travail pour suivre le contenu même s'il est déplacé, donc git mv
est clairement la voie à suivre si vous déplacez des fichiers parce qu'ils appartenaient à la section x
mais maintenant ils appartiennent à x/p/q
parce que le projet a évolué de cette façon.
Parfois, cependant, il y a une raison de déplacer des fichiers vers un sous-répertoire tout au long de l'histoire d'un projet. Par exemple, si les fichiers ont été placés quelque part par erreur et que d'autres commits ont été faits depuis, mais que les commits intermittents n'ont même pas de sens avec les fichiers au mauvais endroit. Si tout cela s'est produit sur une branche locale, nous voulons nettoyer le désordre avant de pousser.
La question précise "avec l'historique de commit", ce que j'interpréterais comme une réécriture de l'historique dans ce sens précis. Cela peut être fait avec
git filter-branch --tree-filter "cd x; mkdir -p p/q; mv [files & sub-dirs] p/q" HEAD
Les fichiers apparaissent alors dans le p/q
tout au long de l'histoire.
Le filtre en arbre est bien adapté aux petits projets, son avantage est que la commande est simple et facile à comprendre. Pour les grands projets, cette solution n'est pas très adaptée, si les performances sont importantes, il faut envisager d'utiliser un filtre d'indexation comme indiqué dans la section cette réponse .
Veuillez noter que le résultat ne doit pas être poussé vers un serveur public si la réécriture touche des commits qui ont déjà été poussés auparavant.