web-dev-qa-db-fra.com

Comment déplacer un répertoire dans un dépôt Git pour toutes les validations?

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 à _poststoujours 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?

67
mipadi

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
94
artagnon

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/- "

33
theduke