2016-08-24 11 views
0

В настоящее время я импортирую репозиторий SVN в Git. Структура репозитория SVN немного беспорядочна, поэтому мне нужно преобразовать его в три отдельных хранилища Git, а затем объединить их все вместе.Внести слияния в прививку История Git

Если это был простой проект с тремя частями к одной истории, то я мог бы просто перебазировать их поверх другого, например:

cd part3 
git remote add -f part1 url_to_part1 
git remote add -f part2 url_to_part2 
git rebase part2/master 
git rebase part1/master 

Однако part3 в моем примере выше содержит десятки тегов и три ветви. Если части 1 и 2 были чисто объединены в master (ну, туловище) внутри SVN, то я бы сделал что-то вроде this, чтобы правильно перевести ветку в историю. Это имеет то преимущество, что все теги остаются на месте, в отличие от rebase.

Но у одной из ветвей есть осиротевшая фиксация, которую мы теперь хотели бы объединить в историю. Теперь, если я попытаюсь исправить историю с помощью трансплантата, изменения от сиротского фиксации будут потеряны. В приведенном ниже примере слияние X-C произошло в SVN, и поэтому я могу создать ссылку с трансплантатом. Но я хочу, чтобы объединить осиротевший совершить O между C и D, сохраняя при этом метки на коммитах E, G и т.д.

A-B-C-[ ]-D-E-F-G-H-... 
\// 
    X--O 

Есть ли способ, что я могу указать структуру графа, используя что-то вроде файла трансплантатов но затем фактически выполнить подразумеваемые слияния? Или есть команда filter-branch, которую я должен использовать здесь?

+0

[примечание по этому вопросу] (http://stackoverflow.com/questions/3810348/setting-git-parent-pointer-to-a-different-parent/3811028#3811028) предполагает, что это невозможно с помощью трансплантаты. Угадайте, что мне придется переустановить, а затем вручную переместить теги. – jkeirstead

ответ

1

git-svnне правильный инструмент для разовых преобразований репозиториев. Это отличный инструмент, если вы хотите использовать 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.

+0

Чтобы уточнить, я использую svn2git с тремя различными наборами параметров в одном репозитории SVN, а затем пытаюсь сшить результаты вместе (потому что одна команда svn2git не соответствует нестандартной компоновке репо SVN). – jkeirstead

+0

Чтобы уточнить, вы ** не ** используете утилиту svn2git, которую я рекомендовал, в противном случае вам не придется прыгать с обручами, как вы пытаетесь сделать. ;-) – Vampire