Получение полной истории репозитория SVN, который был переименован с помощью git-svn - PullRequest
8 голосов
/ 29 июня 2011

У меня есть SVN-репозиторий, который был переименован из «Project» в «Project v1».

Затем я сделал git svn clone, чтобы создать git-версию переименованной папки SVN.

Когда я git log во вновь созданном репозитории git, я вижу только один элемент истории. Это сообщение коммита, которое я дал SVN-репозиторию, когда переименовал папку.

Есть ли способ для репозитория git иметь всю историю SVN до переименования папки (или любых других возможных переименований до этой)?

1 Ответ

9 голосов
/ 29 июня 2011

Единственный способ, которым я делал это в прошлом (не зная, что это лучший или единственный способ!), Это явно 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 или даже дистанционно.

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

...