Как я могу переписать историю, чтобы все файлы, кроме тех, которые я уже переместил, находятся в подкаталоге?
У меня есть проект под 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 за помощь.