Проект был на GitHub некоторое время, но ранее он был перенесен из svn. Когда он был первоначально перенесен, история SVN не была перенесена в Git. Есть ли способ, который может копировать/импортировать/клонировать/перемещать историю SVN в Git после того, как проект был настроен?Импорт истории в существующий проект Git из SVN
ответ
git-svn
is не правильный инструмент для разовых преобразований репозиториев. Это отличный инструмент, если вы хотите использовать Git как интерфейс для существующего сервера SVN, но для одноразовых конверсий вы должны не использовать git-svn
, но svn2git
, который гораздо более подходит для этого прецедента.
Есть инструменты pleny под названием svn2git
, вероятно, лучший из них - KDE один от https://github.com/svn-all-fast-export/svn2git. Я настоятельно рекомендую использовать этот инструмент svn2git
. Это лучшее, что я знаю, доступный там, и он очень гибкий в том, что вы можете делать с его файлами правил.
Если вы не 100% об истории своего репозитория, svneverever
от http://blog.hartwork.org/?p=763 - отличный инструмент для изучения истории хранилища SVN при переносе его на Git.
После того, как вы перевели Ваш SVN репо для правильного Git репо, добавить вновь созданный репозиторий в качестве удаленного в существующий репозиторий и принести коммиты. Затем используйте git replace
, чтобы заменить первое завершение вашей новой истории последним фиксацией вашей старой истории. Если вы хотите сделать это постоянным, вы можете использовать git filter-branch
, чтобы сделать замену постоянной.
Помните, что вы перепишете опубликованную историю и что всем, у кого есть локальные ветви, основанные на прежней истории, придется восстанавливаться после этого изменения истории, как описано в документации git rebase
. Если вы этого не хотите, вы также можете просто перетащить вновь перенесенное репо в свой репозиторий Git и просто создать новые ветки из истории SVN.После этого у вас будет несколько корневых коммитов и независимых историй, которые технически в порядке, но у вас все равно будет сокращение истории файлов.
Это возможно, но вы будете влиять на всех пользователей, которые уже клонировали репозиторий. Поэтому сначала вы должны решить, стоит ли это.
Если это не так, просто клонировать с ГИТ-SVN в другой репозиторий и держать его там в течение истории исходного кода ...
Если вы хотите, чтобы идти дальше, после того, как история извлекается, добавить это новый репозиторий как удаленный в вашем реальном репозитории и выборке.
git fetch --all
Как только это будет сделано, вы должны иметь непересекающуюся историю.
Затем используйте «git replace» для замены первого фиксатора нового репозитория на последнюю ветку, которую вы только что выбрали.
https://git-scm.com/docs/git-replace
И наконец, использовать 'Git фильтр-ветвь', который будет переписать историю определенно.
Вы должны будете нажать новую историю, что-то вроде:
git push origin --all
И все остальные разработчики должны будут клонировать или получать всю историю ... И будет жаловаться ;-)
Спасибо за совет. В настоящее время существует только несколько клонов репо, поэтому он находится под контролем ... Я планирую сделать что-то подобное. Моя идея состоит в том, чтобы преобразовать svn в git, а затем объединить это репо как ветвь существующего репо, а затем переустановить хозяина существующего репо. Считаете ли вы, что это сработает? – mattsun
В духе, 2 решения одинаковы (за исключением случаев, когда «слияние» вы не говорите «выборка», как я описываю. В противном случае вы будете прямо в ад ... :(), но мой легче. ... – Philippe
Вы можете создать новый клон на основе истории Subversion, а затем попытаться объединить эти изменения в существующий репозиторий Git. Обратите внимание, что вы не сможете представить эту историю Subversion в качестве основы для существующей истории Git, но вы можете использовать ее как параллельную историю, которую вы сейчас объедините. – poke
@poke, почему он не сможет? Конечно. Конечно, он перепишет опубликованную историю с этим, и любой, кто использует репо, должен восстановиться, перезарядив все свои ветви вручную, как всегда, с измененной опубликованной историей. – Vampire
@ Vampire Он не может без переписывания истории, вот что я имел в виду. Если проект был активным какое-то время, кажется хорошей идеей сохранить историю как есть. – poke