Как объединить svn-репозиторий с git-клонированным репозиторием (импортируется из SVN через github) - PullRequest
1 голос
/ 16 ноября 2010

В прошлом я использовал функцию импорта GitHub для импорта SVN-репозитория.Репозиторий теперь такой же, как пустой Git без какой-либо связи с историей SVN.Коммиты не содержат svn-id информации.

Некоторое время прошло, и коммиты были добавлены в репозиторий SVN, но, как и ожидалось, репозиторий git остался прежним.

Так что теперь я хотел бы«обновить» репозиторий git коммитами, которые были добавлены в исходный SVN.Я пробовал git-svn, но не мог заставить git распознать общую историю между клонированным svn и клонированным git.

Я рассмотрел использование format-patch и считаю, что это действие должно решить проблемуоднако я искал более автоматизированный способ сделать это.

Единственное ограничение заключается в том, что следует поддерживать историю git (без rebase 'ing) и что коммиты настолько верны репозиторию SVN, насколько это возможно.(к сообщению о фиксации не добавлено svn-id).

1 Ответ

1 голос
/ 16 ноября 2010

Как вы уже догадались, получить коммиты для "слияния" должным образом здесь не получится.Вам придется использовать format-patch.Вот как я бы это сделал:

$ git svn clone --no-metadata svn://.../ new-svn-repo
$ cd new-svn-repo
$ git log

(Вы можете добавить опцию -A к git svn clone, чтобы переписать информацию об авторстве SVN из формата user@uuid в правильное Joe User <user@example.com> авторствоинформация. Информацию см. man git-svn.)

Просмотрите журнал и найдите коммит, соответствующий последнему коммиту в репозитории github.Если это коммит abcdef, тогда:

$ git format-patch -k abcdef

Теперь у вас будет целый набор *.patch файлов, соответствующих новым коммитам, которые вы хотите перенести.Итак ...

$ cp *.patch /github/repository/location
$ cd /github/repository/location
$ git am -k --keep-cr *.patch

Тада!Теперь просто нажмите master на Github.

(Если ваш Git недостаточно новый, он может жаловаться на аргумент --keep-cr для git am. Если ваши исходные файлы не содержат CR, просто удалите --keep-cr.Но если они это сделают, вам может потребоваться обновить ваш Git, поскольку git mailsplit, называемый git am, удалит все CR в файлах исправлений при их обработке. Это может привести к тому, что исправления не будут применяться.)

...