使用TortoiseHG强制版本号

时间:2012-05-24 17:48:24

标签: mercurial versioning

我们在Mercurial版本控制下有一个Java应用程序。我们正在努力在应用程序中实现versioning schema,我想知道TortoiseHG如何帮助解决这个问题。是否可以做一些事情,比如在提交时增加构建版本,或者这对于开发人员来说是否必须这样做?我们当前的计划包括在我们推送到UAT时为每个版本号创建书签。

2 个答案:

答案 0 :(得分:9)

原则上,您必须在TortoiseHg之外执行此操作 - Mercurial(以及TortoiseHg)的工作是保留您的工作副本的状态,就像您单击“提交”时一样。

你可能会得到一点帮助:TortoiseHg可以用pre-commit hook触发这个“外部”动作。这是在hg commit运行之前运行的脚本,该脚本有可能更改文件。

当你尝试实现这样的方案时,请记住Mercurial是一个分散的版本控制系统(这应该不足为奇)......因此人们在本地提交 < / em>无需与中央服务器通信。因此,不可能保证其他人不使用版本号。唯一的解决方法是使用变更集哈希作为版本“数字”,但是你不会得到很好的增加数字。如果您有一个集中式构建服务器,那么您可以让它增加版本号,然后返回到一个简单的集中式世界视图。

最后,让我提一下,Mercurial有一个latesttagdistance template keyword对集中式构建机器非常有用:它计算到最新标签的距离,这个距离通常在构建机器上单调增加。像

一样使用它
hg parents --template "{latesttag}+{latesttagdistance}-{node|short}"

有关更多灵感,请参阅Mercurial setup.py file

答案 1 :(得分:3)

最好让构建系统将当前版本标识符插入到分发存档和/或文件名中。

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

  1. 让构建服务器发出hg id命令以找出构建错误。
  2. 拥有version文件,该文件由Mercurial repo配置中配置的changegroup挂钩填充。
  3. 通过使用关键字扩展名填充version文件。 (不推荐!)
  4. 第一种方法直接从Mercurial获取信息,这对开发人员几乎不需要设置。缺点是它将构建系统与特定版本控制系统紧密结合在一起。

    第二种方法独立于存储库系统,并且如果您是从源存档构建,或者如果要手动指定版本标签。缺点是它确实需要你设置一个钩子,但是由于构建机器通常是专门配置的中央服务器,所以这不应该是一个大问题。

    为了完整起见,我提到了第三种方法,但我认为普遍认为你真的想避免这种机制。

    最好采用1和2的混合方法,首先尝试接近2,然后在找不到version文件时回退到方法1。为了更好地支持hg archive源导出,您还可以检查.hg_archival.txt文件。

    第二个问题是,您对构建号使用什么样的值:

    1. 版本标识符(来自hg id -i)。
    2. 本地修订号(来自hg id -n)。
    3. 使用latesttaglatesttagdistance的标识符,请参阅Martin的回答。
    4. 第一个优点是它非常简单并且唯一地标识了构建的确切版本。虽然它不是人类可读的,并且不能从散列中获得相对年龄。

      第二个具有增量编号,但是此编号仅适用于构建计算机的存储库,因此您应该为开发人员提供一种方法来循环使用此编号来获取变更集哈希ID,否则它将毫无用处。 / p>

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