Перенос двух репозиториев SVN с общей историей в git - PullRequest
4 голосов
/ 23 августа 2011

Я планирую svn для мерзкого переноса нескольких репозиториев. Два из них находятся в определенном состоянии.

Проект был разработан в SVN-репо. Из-за различных ограничений проект в какой-то момент был разветвлен. Форк был сделан путем дублирования репозитория SVN. После этого два проекта развивались отдельно. Никаких веток или тегов в репо не существует, кроме ствола.

Значительная функциональность была разработана для исходного проекта и должна быть перенесена на развилку. В текущей ситуации это можно сделать, создав патч из различных ревизий и применив его к разветвленному проекту. Это имеет преимущество кратковременной простоты в текущей ситуации, но имеет ряд громоздких последствий в долгосрочной перспективе.

Мы могли бы иметь два разных репозитория git и выполнять кросс-форк-портирование через запросы на извлечение, но этого может не хватить удобства (мы не используем github). Кроме того, может наступить время, когда мы захотим реинтегрировать форк в родительский проект благодаря рефакторингу модульной конструкции. Другой подход заключается в объединении двух репозиториев SVN в один репозиторий git в виде отдельных веток и управлении последующим слиянием оттуда (со всеми преимуществами, которые оно дает).

В идеале я бы хотел воссоздать истинную историю проекта, то есть иметь git-репо с:

  • одна ветвь, состоящая из коммитов до форка
  • две разные ветви, состоящие из родительского и ветвления коммитов до HEAD

Интересный факт, который может помочь, следующая команда создает идентичные SHA1 для общих коммитов:

git svn clone -s -A svn.authors --no-metadata http://subversion.foo.local/repo/path git_migration

Меня не волнует --no-metadata, потому что это односторонняя миграция.

Как мне достичь такого результата, если вообще возможно?

Ответы [ 2 ]

2 голосов
/ 23 августа 2011

Поскольку у вас есть способ клонировать репозитории SVN с одинаковыми хешами для общих коммитов, это должно работать.

git svn clone -s -A svn.authors --no-metadata http://subversion.foo.local/repo1/path git_migration
git svn clone -s -A svn.authors --no-metadata http://subversion.foo.local/repo2/path git_migration-2
cd git_migration
git branch repo1 # Branch for first repo
git reset --hard <highest_common_hash> # To have only common history on master
git checkout -b repo2 # Branch for second repo
git pull ../git_migration-2 master

Теперь у вас должна быть общая история в master и 2 ветки для разных SVN.РЕПО.

2 голосов
/ 23 августа 2011

Как правило, присоединение истории к одному корню может быть выполнено с помощью git Очки прививки

Или отсылаю вас к

https://git.wiki.kernel.org/index.php/GraftPoint

Проще говоря, вы просто говорите git, какие ревизии имеют определенную родительскую ревизию (волшебный результат 'слияния', если хотите). Как только вы будете счастливы, вы можете бросить его в камень, используя git filter-branch

Образец от man git-filter-branch

echo "$commit-id $graft-id" >> .git/info/grafts
git filter-branch $graft-id..HEAD
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...