Получение полной истории репозитория SVN, который был переименован с помощью git-svn
У меня есть SVN-репозиторий, который был переименован из "Project" в "Project v1".
Я тогда сделал git svn clone
создать git-версию переименованной папки SVN.
Когда я git log
В недавно созданном Git-репозитории я вижу только один элемент истории. Это сообщение о коммите, которое я дал SVN-репозиторию, когда переименовал папку.
Есть ли способ для репозитория git иметь всю историю SVN до переименования папки (или любые другие возможные переименования до этого)?
1 ответ
Единственный способ, которым я делал это в прошлом (не зная, что это лучший или единственный способ!), Был явно git svn fetch
предыдущей истории (для этого вам может понадобиться второй пульт), а затем привить переименованное дерево к старой git filter-branch
(в документации есть конкретный пример для перерисовки дерева).
пример
От: svn://server/repo/project
Для того, чтобы: 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
так что ваш основной называется "svn". Вы можете назвать другой -old
или даже дистанционно.
Предостережение: это по памяти, и я не просто повторил эти шаги сам. Комментарии и исправления приветствуются.