Mercurial 带龟甲的强制版本号

Mercurial 带龟甲的强制版本号,mercurial,versioning,Mercurial,Versioning,我们有一个在Mercurial版本控制下的Java应用程序。我们正在致力于在应用程序中实现一个新的应用程序,我想知道TortoiseHG如何帮助实现这一点。是否可以在提交时增加构建版本,或者这必须完全由开发人员决定?我们目前的计划包括在推送到UAT时为每个版本号创建书签。原则上,您必须在OrtoisehG之外完成这项工作-Mercurial(因此也是OrtoisehG)的工作是保持您的工作副本的状态与您单击“提交”时的状态完全相同 不过,你可能会得到一些帮助:乌龟可以通过一个简单的动作触发这个“

我们有一个在Mercurial版本控制下的Java应用程序。我们正在致力于在应用程序中实现一个新的应用程序,我想知道TortoiseHG如何帮助实现这一点。是否可以在提交时增加构建版本,或者这必须完全由开发人员决定?我们目前的计划包括在推送到UAT时为每个版本号创建书签。

原则上,您必须在OrtoisehG之外完成这项工作-Mercurial(因此也是OrtoisehG)的工作是保持您的工作副本的状态与您单击“提交”时的状态完全相同

不过,你可能会得到一些帮助:乌龟可以通过一个简单的动作触发这个“外部”动作。这是在运行
hg commit
之前运行的脚本,该脚本有机会更改文件

当您尝试实施这样一个方案时,请记住Mercurial是一个分散的版本控制系统(这一点也不奇怪…),因此人们在本地进行提交,而无需与中央服务器进行通信。因此,无法保证其他人没有使用版本号。唯一的解决方法是使用变更集散列作为版本“编号”,但这样您就无法很好地增加编号。如果您有一个集中式构建服务器,那么您可以让它增加版本号,然后返回到一个简单的集中式世界视图

最后,我要提到的是,Mercurial有一个对集中式构建机器非常有用的方法:它计算到最新标记的距离,而这个距离在构建机器上通常是单调增加的。像这样使用它

hg parents --template "{latesttag}+{latesttagdistance}-{node|short}"

有关更多信息,请参阅。

最好让生成系统在分发存档和/或文件名中插入当前版本标识符

第一个问题是,如何获取此版本标识符。基本上有三种方式:

  • 通过让构建服务器发出
    hgid
    命令来查找构建错误
  • 通过在Mercurial repo配置中配置
    版本
    文件,该文件由
    变更组
    钩子填充
  • 通过使用关键字扩展名填充
    版本
    文件。(不推荐!)
  • 第一种方法直接从Mercurial获取信息,开发人员几乎不需要设置。缺点是它将构建系统与特定版本控制系统紧密耦合

    第二种方法保持独立于存储库系统,并且在您(例如,从源归档文件生成)或想要手动指定版本标签时仍然可用。缺点是它确实需要您设置一个钩子,然而,由于构建机器通常是专门配置的中央服务器,所以这应该不是一个大问题

    为了完整起见,我提到了第三种方法,但我认为大家都同意,你真的想避免这种机制

    最好采用1和2的混合方法,首先尝试方法2,当找不到
    版本
    文件时,采用方法1。为了更好地支持
    hg archive
    源代码导出,您还可以检查
    .hg\u archive.txt
    文件

    第二个问题是,构建编号使用哪种值:

  • 版本标识符(来自
    hgid-i
  • 本地版本号(来自
    hg id-n
  • 使用
    latesttag
    latesttagdistance
    的标识符,参见Martin的答案
  • 第一种方法的优点是它相当简单,并且可以唯一地标识所构建的确切版本。不过,它不是很容易让人理解,而且从散列中也无法得出相对年龄

    第二个有一个递增的数字,但是这个数字只适用于构建机器的存储库,所以您应该向开发人员提供一种方法来循环这个数字以获得变更集哈希id,否则它将毫无用处

    我个人特别喜欢的第三种方法是,它以一种非常人性化的方式使用标记和距离提供时间信息,并另外指定精确修订的节点ID。不过时间相当长