0

尽管 Mercurial 具有去中心化的性质,但我们有一个集中的服务器,我们都推送到它,它会在夜间进行构建、打包等......

这是我们想要实现的目标:源代码控制的文件之一包含主要+次要版本号,理想情况下,每次提交都必须增加这些版本号。由于在开发人员的机器上不可能进行集中编号,因此我们正在考虑在主服务器上使用一个预提交脚本,该脚本将为每个推送的提交写入一个新的次要版本号到该文件。问题是/是:

  • 因为它是预先提交的,所以这个文件更改可以是同一个提交的一部分吗?
  • 如果不是,预提交是否会导致另一个提交,你如何防止它级联/递归?
  • 如何做到这一点?
  • 有更好的解决方案吗?
4

2 回答 2

4

“预提交”脚本仅在提交时触发。当用户送到他们已经提交的“中央”服务器时,预提交钩子做任何事情都为时已晚。当开发人员推送时,您可以触发在“中央”服务器上运行changegroupincoming钩子,但这些不能修改提交——提交已经提交/烘焙/完成,他们只能对它们做出反应.

作为一个建议,实际上不要将版本字符串放入文件中——每次提交都会更改一个文件,这只会让合并变得很痛苦。而是执行以下一项或多项操作:

  • 有一个 CI 服务器(如 Jenkins)在每次推送时构建并使用 Jenkins 构建号,它可以传递到您的构建脚本中
  • 使用 Mercurial nodeid (hash) 作为版本字符串的一部分,这样您就可以始终准确地知道构建中的修订版本——并且不要将它放在文件中,只需在构建(或部署)脚本中查询它
  • 使用changegroup钩子自动标记推送,它为提交应用一个漂亮的(可能是连续的)名称(注意,这几乎使你的提交数量翻了一番,因为每个标签都是一个提交)

就个人而言,我在构建脚本中使用了类似的东西:

build.sh --version_string=$(hg log -r . --template '{latesttag}.{latesttagdistance}-{node|short}')

这让我得到了看起来像“ 1.0.3-5fd8ed67272e”的版本字符串,可以粗略地解读为“从变更集三个提交构建,因为版本 1.0 被标记为 nodeid 5fd8ed67272e”,这非常好——而且它从来没有保存到文件中VERSION当我的部署脚本将其上传到服务器时,编译(用于编译语言)或写入文件。

于 2012-04-13T23:09:55.120 回答
0

有关此问题的一些评论和想法,请参阅Mercurial 文档中的此页面。另请参阅如何在 Mercurial 中扩展某些版本关键字?以及那里引用的其他 SO 答案。

于 2012-04-19T11:46:38.047 回答