Действительно ли возможно вытянуть от/продвигать в репозиторий Хранилища SourceGear, использующий Подвижный?

Я заметил, что этот вид функциональности существует для подверсии, и это работает очень приятно. Я задавался вопросом, существует ли такая вещь для Хранилища SourceGear.

7
задан user151019 11 June 2012 в 10:38
поделиться

1 ответ

Нет, боюсь, у нас есть только двусторонние мосты для 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).

Надеюсь, это руководство поможет вам или кому-то еще! :-)

11
ответ дан 6 December 2019 в 22:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: