У меня есть репозиторий svn со многими проектами, но меня интересуют только некоторые (части сервера и полного клиента).Преобразование svn проектов в git, но разрешить слияние исправлений, сделанных в svn
trunk
server
src
src-that-should-be-in-client
other-src-that-belongs-to-server
cfg
cfg-that-should-be-in-client
other-cfg-that-belongs-to-server
client
docs
foo
bar
В процессе преобразования системы сборки клиента я хочу преобразовать проект в git. Но все ветки поддержки, где будут исправлены ошибки, остаются в svn.
Я хочу, чтобы объединить исправления, сделанные в ветвях svn поддержки, в git (и, возможно, наоборот). Хорошо, что это легко, я знаю, как это сделать (я не заинтересован в старых ветвей и тегов):
# create mirror of client
git svn clone --prefix=svn/ --trunk=trunk/client http://svn-server client
cd client
git remote add mirror path_to_remote_mirror
crontab -e # automatically call git svn rebase and git push mirror
# repeat for server
Работа будет осуществляться на вилке удаленного зеркала. Чтобы объединить исправления, сделанные в svn, просто добавьте зеркало как удаленное и продолжите, как описано в другом месте (например, github). Cherry-Picking в другом направлении немного более продвинутый, но возможно.
Но я хочу переместить части сервера на клиент после перехода на git-без потери истории и возможности слияния исправлений.
Один из способов, я думал об изменении команды git svn clone
с использованием --trunk=trunk
и добавлении --include-paths=(?:server|client)
. Теперь у меня есть зеркало как сервера, так и клиента в одном репозитории git. Я бы раскошелил его, переместил части, принадлежащие клиенту, удалил папку с сервером и, наконец, переместил все под клиентом в корень (конечно, с промежуточными коммитами).
Другой способ сделать это - создать вилку клиента и subtree merge части сервера.
Я вижу, что одна проблема с первым подходом, который добавляется в файл svn в код сервера, также будет объединена, а файлы, измененные в коде сервера (и удаленные в git), могут привести к конфликтам слияния. Обход проблемы: используйте git merge --no-commit
, чтобы проверить сервер-каталог, если он создан во время слияния, если он содержит файлы, принадлежащие клиенту, переместить их, удалить server-dir, commit. Но кроме этого, кажется, достаточно легко сделать не-git-wizzards. Может быть, его можно улучшить, вызвав потом фильтр-фильтр?
Для второго подхода я не уверен, если слияния даже будут работать. По крайней мере, это кажется более продвинутым и, возможно, не выполнимым не-git-wizzards.
Какой подход лучше? Или есть лучший подход?
Да, это в основном то, что я хочу сделать. Об этом я уже говорил в этом вопросе. Единственное различие заключается в том, что у меня будет выделенный репозиторий, так как зеркало и разработка будут выполняться на вилке. Но основной макет будет таким же. Хорошо узнать, что это сработает. Но мой вопрос заключается в том, будет ли слияние работать, если я перемещу много файлов в git? И svn-клонирование большего количества репозитория svn лучше, чем выполнение слияния поддерева. Может быть, я должен задать более специальный вопрос о слиянии поддерева без всякого материала svn и изменить этот вопрос. –
Это был мой опыт, что вы хотите только «git svn clone» каталог SVN, который вы хотите портировать на Git. Если вы правильно зададите параметры URL-адреса SVN и «git svn clone», все ветви и теги SVN должны быть преобразованы в ветви Git, если только репозиторий SVN не имеет стандартную структуру каталогов. Если это так, см. [Клонирование нестандартного репозитория Svn с Git-Svn] (http://stackoverflow.com/questions/572893/cloning-a-non-standard-svn-repository-with-git-svn) –