是否可以使用Mercurial从/推送到SourceGear Vault存储库?

Pau*_*ius 7 mercurial dvcs sourcegear-vault

我注意到这种功能存在于颠覆中,并且它的工作非常好.我想知道SourceGear Vault是否有这样的东西.

Mar*_*ler 11

不,我担心我们只有SubversionGit的双向桥梁.我没有听说有人为SourceGear Vault编写桥梁.

但是,您仍然可以在其他系统使用Mercurial .这是一种适用于所有版本控制系统(VCS)的通用技术.你做的是以下几点:

从外部版本控制系统中查看最新版本的代码.初始化Mercurial存储库,添加所有文件并进行提交:

# checkout foreign VCS
$ hg init
$ hg addremove
$ hg commit
Run Code Online (Sandbox Code Playgroud)

工作副本现在既是Mercurial工作副本,也是外国系统的工作副本.您将在Mercurial中进行开发并定期将其导入到外部系统中,并且您将定期将更改从外部VCS导入Mercurial.

我们将使用被调用的分支default来跟踪外部系统的历史,并使用一个名为的分支hg来跟踪我们在Mercurial中所做的开发.

注意:如果您使用命名分支来分隔两行开发,那么以下安东评论说Vault将显示太多文件 - 如果这对您来说是个问题,请使用两个克隆.

让我们做hg分支:

$ hg branch hg
$ hg commit -m "Started hg branch"
Run Code Online (Sandbox Code Playgroud)

你现在可以开发一些东西:

# work, work, work...
$ hg commit -m 'Fixed bug 42'
# work, hack, work...
$ hg commit -m 'Customers will love this feature!'
Run Code Online (Sandbox Code Playgroud)

当你像这样工作时,default分支将开始偏离hg分支 - 差异正是尚未导出到外部系统的变化.你可以看到差异

$ hg diff default:hg
Run Code Online (Sandbox Code Playgroud)

要实际导出更改,请更新到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
Run Code Online (Sandbox Code Playgroud)

然后,您可以更新回hg分支并继续使用Mercurial

$ hg update hg
# work, work, wok...
Run Code Online (Sandbox Code Playgroud)

当外部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'
Run Code Online (Sandbox Code Playgroud)

hg addremove步骤确保Mercurial获取在外部VCS中发生的任何重命名.您需要尝试使用相似性参数来查找适合您的设置.使用hg status -C看计划重命名.

您现在需要将这些更改合并到hg分支中,以便您可以将它们合并到基于Mercurial的进一步工作中:

$ hg update hg
$ hg merge default
$ hg commit -m 'Merge with default'
Run Code Online (Sandbox Code Playgroud)

您继续这样工作 - 始终在hg分支上进行新的本地开发,并default在使用外部VCS命令(更新,提交等)之前始终更新到分支.

我希望本指南可以帮助您或其他人!:-)

  • 很好的答案,但在使用Vault的特定情况下,我建议一个更改:使用克隆而不是命名分支,即保留原始的"Vault repo",克隆它并在克隆中工作.尽管Vault客户端(从5.1.2开始)仅提交实际*已更改*的文件,但它似乎完全依赖于时间戳来决定报告哪些文件已更改,因此您最终可能会遇到"待更改集"杂乱无章的误报. (2认同)