Получение полной истории репозитория 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 или даже дистанционно.

Предостережение: это по памяти, и я не просто повторил эти шаги сам. Комментарии и исправления приветствуются.

Другие вопросы по тегам