Единственный способ, которым я делал это в прошлом (не зная, что это лучший или единственный способ!), Это явно git svn fetch
предыдущая история (для этого вам может понадобиться второй пульт), а затем пересадка переименованного дерева на старая история с git filter-branch
(в документации есть конкретный пример для перерисовки дерева).
Пример
От: svn://server/repo/project
To: svn://server/repo/project_v1
Необязательный первый шаг: если для этого нет репо git-svn
, продолжайте и git svn clone svn://server/repo/project
. У большинства людей, вероятно, уже есть этот репо, потому что они все время работают с git-svn
. Если у вас еще нет git-репо, вы можете выполнить начальный клон с любой стороны.
В вашем репозитории git-svn
добавьте пульт дистанционного управления для нового имени проекта. Я не думаю, что есть команда для этого, вы просто добавляете строфу к вашему .git/config
, очень похожему на тот, который уже есть:
[svn-remote "svn_v1"]
url = svn://server/repo/project_v1
fetch = :refs/remotes/git-svn-v1
Этот новый SVN-пульт можно выбрать с помощью опции --remote svn_v1
для любой команды git-svn
. Первое, что вы захотите сделать, это git-svn fetch --remote svn_v1
, который заполнит ваш git-репо историей этой копии. Как отмечается в оригинальном вопросе, это будет очень краткая история!
Теперь мы применим пример на справочной странице git filter-branch
. Вам нужно будет знать совет старой истории, который равен git show-ref -s remotes/git-svn
(опять же, при условии, что ваш оригинальный клон был старой версией). Затем используйте git filter-branch --parent-filter 'sed "s/^\$/-p <graft-id>/"' remotes/git-svn-v1
, где <graft-id>
- это SHA, который вы только что получили для наконечника старой истории.
Убедитесь, что это работает с git log remotes/git-svn-v1
и посмотрите всю историю.
В этот момент вы можете перейти к своей рабочей ветке и git reset --hard remotes/git-svn-v1
, чтобы переключить эту ветку на новую историю.
Обратите внимание, что svn-remote
с именем "svn" будет вашим значением по умолчанию, поэтому в конце вы захотите переименовать пульты в [svn-remote "..."]
строках в .git/config
, чтобы ваш основной был назван «СВН». Вы можете назвать другой -old
или даже дистанционно.
Предостережение: это по памяти, и я не просто повторил эти шаги сам. Комментарии и исправления приветствуются.