Вопрос похож на этот (без ответа) и этот (та же проблема, не связанная с Git).
Цель состоит в том, чтобы сделать Hg
- интерфейс для SVN на некоторое время, прежде чем полностью перейти на Hg.
Настройка, вероятно, должна выглядеть так, как показано ниже (так же, как и в вопросах, упомянутых выше), однако я не уверен в точной топологии промежуточных репозиториев Hg.
Dev1 Hg --> Hg <--> SVN
Dev2 Hg -/
Я знаю, что указанная выше настройка работает с git
и git-svn
, как описано в этом комментарии :
Dev1 Git --> Git (bare) <--> Git (bridge) <--> SVN
Dev2 Git -/
Настройка:
Либо
git svn init
илиgit svn clone
репозиторий SVN. Затем это становится «Git / SVN Bridge».Исправьте здесь любые ветки, теги и т. Д. Ссылки
svn / *
считаются удаленными, поэтому, если вы хотите отслеживать ветки, отметьте эти пульты и создайте соответствующие локальные ветки. Также проверьте теги и создайте настоящие теги. Вы ДОЛЖНЫ создать локальные ветки для любых ветвей SVN, которые вы хотите синхронизировать между Git и SVN.Теперь создайте где-нибудь новый пустой репозиторий (
git init
) и с моста нажмите все ветки. в чистый репо (git push –tags
).Все пользователи Git теперь клонируют этот пустой репозиторий. Мост будет обслуживаться только одним (или несколькими) людьми, которые понимают, как синхронизировать Git и SVN.
Чтобы обновить магистраль SVN с изменениями на главном сервере и наоборот, с моста:
git svn fetch
(получить новые изменения SVN)
git checkout master
git pull master
(получить изменения Git из чистого репозитория)
git checkout svn / trunk
(отсоединенная голова для проверки)
git merge –no-ff –log master
(объединить изменения из мастера).–no-ff
обеспечивает фактическую фиксацию,–log
копирует отдельные сообщения журнала из каждой фиксации на главном сервере (–log
является необязательным). Затем можно запустить git commit –amend, если вы хотите отредактировать сообщение фиксации.
git svn dcommit
(Это подталкивает вашу фиксацию слияния к SVN. Обратите внимание, что фиксация была на отдельной голове и больше не доступна). Вся ваша работа над мастером (начиная с базы слияния мастера иsvn / trunk
) фиксируется как одно изменение и теперь доступна пользователям SVN.
git checkout master
git merge svn / trunk
(Получает новые обновления из SVN - с измененным сообщением фиксации - и объединяется в мастер)
git push barerepo
(делает изменения SVN доступными для пользователей Git)
Что я не знаю, возможно ли как-то воспроизвести вышесказанное на Hg. На мой взгляд (я промежуточный пользователь Git и знаю основы работы с Hg), препятствиями в Hg являются:
hgsubversion
(шаг n. 6 в приведенном выше списке. Что мешает hgsubversion
делать то, что делает svn dcommit
?) Можно ли заставить шлюз Hg-SVN работать так же, как шлюз Git-SVN? Если нет, то почему?