Disons que j'ai un dépôt qui comprend cette structure de répertoire:
repo/
blog/
_posts/
some-post.html
another-file.txt
Je veux bouger _posts
au niveau supérieur du dépôt, de sorte que la structure ressemblera à ceci:
repo/
_posts/
some-post.html
another-file.txt
C'est assez simple avec git mv
, mais je veux que l'histoire ressemble à _posts
toujours existait à la racine du dépôt, et je veux pouvoir obtenir l'historique complet de some-post.html
via git log -- _posts/some-post.html
. J'imagine que je peux utiliser un peu de magie avec git filter-branch
pour accomplir cela, mais je n'ai pas compris exactement comment faire cela. Des idées?
Vous pouvez utiliser le filtre de sous-répertoire pour y parvenir
$ git filter-branch --subdirectory-filter blog/ -- --all
EDIT 1: Si vous ne voulez pas faire efficacement _posts
la racine, utilisez plutôt un filtre arborescent:
$ git filter-branch --tree-filter 'mv blog/_posts .' HEAD
EDIT 2: Si blog/_posts
n'existait pas dans certains commits, ce qui précède échouera. Utilisez-le à la place:
$ git filter-branch --tree-filter 'test -d blog/_posts && mv blog/_posts . || echo "Nothing to do"' HEAD
Bien que la réponse de Ramkumar soit très utile et utile, elle ne fonctionnera pas dans de nombreuses situations. Par exemple, lorsque vous souhaitez déplacer un répertoire avec d'autres sous-répertoires vers un nouvel emplacement.
Pour cela, la page de manuel contient la commande parfaite:
git filter-branch --index-filter \
'git ls-files -s | sed "s-\t\"*-&NEWSUBDIR/-" |
GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
git update-index --index-info &&
mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"' HEAD
Remplacez simplement NEWSUBDIR par le nouveau répertoire souhaité. Vous pouvez également utiliser des répertoires imbriqués comme dir1/dir2/dir3/- "