Есть ли способ "настойчиво" синхронизировать репозиторий git с SVN?

Из того, что я мог найти в Интернете, кажется, что использование git svn не "сохраняется".

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

Есть ли способ решить эту проблему?

Ответ 1

Клон по существу просто инициализирует новый репозиторий git, устанавливает удаленный origin, запускает git fetch и создает ветвь на основе удаленного репозитория HEAD. Ни одна из этих операций не рассматривает информацию .git/svn в удаленном репозитории - я думаю, что все, кроме refs, objects и HEAD в каталоге удаленного хранилища git, считается закрытым.

Что же касается этого, вы всегда можете rsync -a или scp -r удаленный репозиторий вместо клонирования, который должен работать - все метаданные Subversion должны быть скопированы.

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

Ответ 2

Я нахожу, что самый простой способ - это git svn init клон с теми же параметрами, которые вы использовали для создания первого git -svn clone, за которым следуют update-ref и dcommit.

Скажите, что вы сделали:

git svn clone -s svn://сервер/веб-сайт

.. для создания первого репо. Затем вы клонируете его:

git clone website website2
cd website2 

Инициализировать git -svn:

git svn init -s svn://server/website

Теперь вам нужно обновить удаленную ссылку git -svn, чтобы указать на последнюю фиксацию, например:

git update-ref refs/remotes/trunk refs/remotes/origin/HEAD

И затем просто сделайте git svn dcommit, чтобы восстановить git -svn revmap.

git svn dcommit

Вы должны увидеть некоторые результаты следующим образом:

git svn dcommit
Rebuilding .git/svn/refs/remotes/trunk/.rev_map.dbae88...
r1 = a9cf429caa11ba5433a6526c2d327de6db2605d1
r2 = 2811ffb78c0a9e0a74208758367044710c1c0159
r4 = 1b787f296aeb98806875ca4f2bde67131720cd57
r9 = 991400ef398fad17ca14253467997d4764561cff
r11 = c5984281dd185d3dbb3bf3fa26f168f34d4e4b53
r13 = aa7678d2f9b5f87152ab09a59ea11a4643e84b6c
r14 = 1c91c959e3bbd2d41dd001a670d01abef29ae1ad
Done rebuilding .git/svn/refs/remotes/trunk/.rev_map.dbae88...
Committing to svn://server/website/trunk ...

Для получения дополнительной информации см. этот пост, особенно пункт 5.