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

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

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

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

Ответы

Ответ 1

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

Если вы хотите, чтобы история проекта выглядела так, как будто все файлы всегда находились в каталоге 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

Ответ 2

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

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, но я могу жить с этим.

Большое спасибо Dan Molding (!!!) и Jefromi за помощь.