Проблема
Я хотел бы переместить папку (и вложенные папки) из одного репозитория в другой, сохранив историю.
Я нашел один подход к SE: Как перенести файлы из одного репозитория git в другой (не клон), сохраняя историю. И другая идея на blog.neutrino.es. Это последнее, что я хотел бы обсудить здесь.
Попытка решения
mkdir /tmp/mergepatchs
cd ~/repo/org
export reposrc=myfile.c #or mydir
git format-patch -o /tmp/mergepatchs $(git log $reposrc|grep ^commit|tail -1|awk '{print $2}')^..HEAD $reposrc
cd ~/repo/dest
git am /tmp/mergepatchs/*.patch
Если я правильно понимаю, идея состоит в том, чтобы притворяться, что мы собираемся отправить коммиты по электронной почте и повторно импортировать их в другой репозиторий.
Ошибка
Я получаю это сообщение об ошибке при выполнении git am /tmp/mergepatchs/*.patch
:
Applying: Initial commit
error: .gitignore: already exists in index
error: README.md: already exists in index
Patch failed at 0001 Initial commit
The copy of the patch that failed is found in:
/Users/myuser/repo/org/.git/rebase-apply/patch
When you have resolved this problem, run "git am --continue".
If you prefer to skip this patch, run "git am --skip" instead.
To restore the original branch and stop patching, run "git am --abort".
Чтобы лучше понять процесс, я сначала попробовал один файл (а не весь каталог). Однако "ничего" не произошло после git am
(т.е. Никакого нового файла, git status
не сообщает о каких-либо изменениях). Почему это?
Затем я попытался:
INITCOMMIT=$(git rev-list --parents HEAD | egrep "^[a-f0-9]{40}$")
git format-patch -1 -o /tmp/mergepatchs ${INITCOMMIT}
Но затем получилось такое же сообщение об ошибке, что и раньше.
Почему патчи не работают?
Изменить 1
Я пробовал что-то связанное, вдохновленное Как создать и применить патч с помощью Git.
В ~/repo/org
:
$ git format-patch --root HEAD --stdout myfile.c > /tmp/mergepaths/01.patch
В ~/depo/dest
:
$ git apply --stat /tmp/mergepaths/01.patch
0 files changed
$ git apply --check /tmp/mergepaths/01.patch
$ git am < /tmp/mergepaths/01.patch
Оба stat
и check
говорят мне, что ничего не будет сделано. Объект патча далеко не пуст.
Кстати, я не знаю, насколько это актуально, но создание и применение патчей выполняется в ветких.