Я заметил, что этот вид функциональности существует для подверсии, и это работает очень приятно. Я задавался вопросом, существует ли такая вещь для Хранилища SourceGear.
Нет, боюсь, у нас есть только двусторонние мосты для Subversion и Git. Я не слышал, чтобы кто-нибудь написал мост для SourceGear Vault.
Однако вы все еще можете использовать Mercurial поверх другой системы. Это общая техника, которая работает для всех систем контроля версий (СКВ). Вы делаете следующее:
Проверьте последнюю версию кода из вашей зарубежной системы контроля версий. Инициализируйте репозиторий Mercurial, добавьте все файлы и сделайте фиксацию:
# checkout foreign VCS
$ hg init
$ hg addremove
$ hg commit
Рабочая копия теперь является как рабочей копией Mercurial так и рабочей копией для зарубежной системы. Вы будете вести разработку в Mercurial и периодически импортировать её во внешнюю систему, а также периодически импортировать изменения из внешней VCS в Mercurial.
Мы будем использовать ветку под названием default
для отслеживания истории внешней системы, и именованную ветку под названием hg
для отслеживания разработки, которую мы ведем в Mercurial.
Примечание: Антон комментирует ниже, что Vault покажет слишком много файлов, если вы используете именованные ветви для разделения двух линий разработки - используйте два клона, если для вас это проблема.
Давайте сделаем ветку hg
:
$ hg branch hg
$ hg commit -m "Started hg branch"
Теперь вы можете что-то разрабатывать:
# work, work, work...
$ hg commit -m 'Fixed bug 42'
# work, hack, work...
$ hg commit -m 'Customers will love this feature!'
По мере того, как вы работаете таким образом, ветка default
начнёт расходиться с веткой hg
- разница заключается именно в изменениях, которые ещё предстоит экспортировать во внешнюю систему. Разницу можно увидеть на
$ hg diff default:hg
Чтобы экспортировать изменения, вы обновляетесь до ветки default
, сливаете в неё hg
и фиксируете изменения в вашей внешней системе:
$ hg update default
$ hg merge hg
$ hg commit -m 'Merge with hg'
# get list of renamed files:
$ hg status --added --copies --change . | grep -A 1 '^ '
# commit to foreign VCS
Затем вы можете обновиться до ветки hg
и продолжить работу с Mercurial
$ hg update hg
# work, work, wok...
Когда изменения вносятся другими участниками внешней VCS, вы должны слить их обратно в вашу ветку hg
. Сначала вы обновляетесь до ветки default
. Это гарантирует, что рабочая копия выглядит так, как ожидает иностранный VCS. Затем вы можете обновить рабочую копию - это заставит Mercurial увидеть изменения, которые вы зафиксируете в Mercurial:
$ hg update default
# update working copy using foreign VCS
$ hg addremove --similarity 90
$ hg commit -m 'Imported changes from foreign VCS'
Шаг hg addremove
гарантирует, что Mercurial подхватит все переименования, произошедшие в зарубежной VCS. Вам придется поэкспериментировать с параметром similarity, чтобы найти подходящее для вас значение. Используйте hg status -C
, чтобы увидеть запланированные переименования.
Теперь вам нужно слить эти изменения обратно в ветку hg
, чтобы вы могли включить их в свою дальнейшую работу на основе Mercurial:
$ hg update hg
$ hg merge default
$ hg commit -m 'Merge with default'
Вы продолжаете работать таким образом - всегда делая новые локальные разработки в ветке hg
, и всегда обновляя ветку default
перед использованием внешних команд VCS (update, commit, etc).
Надеюсь, это руководство поможет вам или кому-то еще! :-)