Как я могу переместить каталог в репозитории Git для всех коммитов? - PullRequest
65 голосов
/ 29 июня 2010

Допустим, у меня есть репо, включающее эту структуру каталогов:

repo/
  blog/
    _posts/
      some-post.html
  another-file.txt

Я хочу переместить _posts на верхний уровень репо, поэтому структура будет выглядеть следующим образом:

repo/
  _posts/
    some-post.html
  another-file.txt

Это достаточно просто с git mv, но я хочу, чтобы история выглядела так, как будто _posts всегда существовал в корне репо, и я хочу иметь возможность получить всю история some-post.html через git log -- _posts/some-post.html. Я полагаю, что могу использовать магию с git filter-branch для достижения этой цели, но я точно не понял, как это сделать. Есть идеи?

Ответы [ 2 ]

91 голосов
/ 29 июня 2010

Для достижения этой цели вы можете использовать фильтр подкаталоговвместо этого:

 $ git filter-branch --tree-filter 'mv blog/_posts .' HEAD

РЕДАКТИРОВАТЬ 2: Если blog/_posts не существовало в некоторых коммитах, вышеприведенный сбой.Используйте это вместо:

 $ git filter-branch --tree-filter 'test -d blog/_posts && mv blog/_posts . || echo "Nothing to do"' HEAD
33 голосов
/ 27 ноября 2012

Хотя ответ Рамкумара очень полезен и полезен, он не будет работать во многих ситуациях.Например, если вы хотите переместить каталог с другими подкаталогами в новое место.

Для этого на странице руководства есть идеальная команда:

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

Просто замените NEWSUBDIR на желаемоеновый каталог.Вы также можете использовать вложенные каталоги, такие как dir1 / dir2 / dir3 / - "

...