Как я могу переписать историю так, чтобы все файлы, кроме тех, которые я уже переместил, были в подкаталоге? - PullRequest
53 голосов
/ 28 октября 2010

У меня есть проект под git.Однажды я переместил все файлы проекта из текущего каталога в foo/bar/ в рамках проекта.Я сделал это используя git mv.Затем я добавил еще несколько файлов и внес некоторые изменения в уже существующие файлы.

В результате теперь, когда я просматриваю историю foo/bar/file.c, я вижу только те изменения, которые я сделал после перемещения файла..

Я пытался исправить это различными способами (filter-branch с фильтром подкаталогов и т. Д.), Но ничего не помогло, так что я довольно сильно застрял здесь.Я буду признателен за любую помощь, которую вы можете оказать мне.Спасибо!

Ответы [ 2 ]

93 голосов
/ 28 октября 2010

Чтобы переписать историю с перемещенными файлами:

Если вы хотите, чтобы история проекта выглядела так, как будто все файлы всегда находились в каталоге foo/bar, то вам нужно сделать небольшую операцию. Используйте git filter-branch с «древовидным фильтром», чтобы переписать коммиты так, чтобы в любом месте foo/bar не существовало, оно создавалось и все файлы перемещались в него:

git filter-branch --prune-empty --tree-filter '
if [ ! -e foo/bar ]; then
    mkdir -p foo/bar
    git ls-tree --name-only $GIT_COMMIT | xargs -I files mv files foo/bar
fi'

Теперь история будет записываться так, как если бы все файлы были всегда , расположенными в foo/bar.

Чтобы просмотреть историю перемещенного файла:

Если вы просто хотите просмотреть историю файла, который был перемещен или переименован в какой-то момент в прошлом, просто используйте параметр --follow для git log:

git log --follow foo/bar/file.c
7 голосов
/ 02 ноября 2010

Чтобы подвести итоги, вот краткое изложение того, что я сделал.Команда, которая работала для меня, была:

if [ ! -e foo/bar ]; then mkdir -p foo/bar; git ls-tree --name-only $GIT_COMMIT | grep -v ^foo$ | xargs -I files mv files foo/bar || echo ""; fi

Команда echo, которую я добавил в конце, гарантировала, что даже при сбое mv вся команда продолжит работать.Он не перемещал содержимое foo / bar / foo, но я могу с этим смириться.

Большое спасибо Дэну Молдингу (!!!) и Джефроми за помощь.

...