使用分布式版本控制时的构建排序
现在,我们正在使用Perforce进行版本控制。它具有一个方便使用的功能,即可以使用一个严格增加的更改编号来引用内部版本,例如"如果内部版本至少为44902,我们将得到错误修正"。
我想切换到使用分布式系统(可能是git),以便更轻松地分支和在家工作。 (这两种方法都可以通过Perforce完全实现,但是git工作流程具有一些优势。)因此,尽管"分布式开发"将是分布式的,并且不涉及通用的修订顺序,但我们仍将维护一个主git repo,以确保所有更改都可以需要在创建构建之前将其填充。
保留严格增加的构建ID的最佳方法是什么?我能想到的最直接的方法是拥有某种后提交钩子,该钩子在主存储库更新时触发,并注册新的树对象(或者提交对象)(的散列)? git)和一个分发ID的集中式数据库。 (我说的是"数据库",但我可能会用git标签来做,只是寻找下一个可用的标签号或者其他内容。因此,"数据库"实际上就是.git / refs / tags / build-id /。 )
这是可行的,但是我想知道是否有更简单的,或者已经实现的,或者标准/"最佳实践"的方式来完成此任务。
解决方案
只要构建成功(甚至失败),我都会使用"标签"创建标签,并且我们将能够永久识别该构建。它不是完全一样,但是它确实提供了这些内部版本号,同时仍然提供了分布式开发的好处。
git tag可能足以满足需求。选择一种标签格式,每个人都同意不要使用其他格式。
注意:在本地标记时,git push
不会更新服务器上的标记。为此使用git push --tags
。
我们应该研究git describe
。它给出了一个唯一的字符串,该字符串根据最新的带注释的标签,自该标签以来的提交次数以及分支头的缩写提交ID来描述当前分支(或者任何传递的提交ID)。
大概我们只有一个分支,可以执行受控的构建发布。在这种情况下,我将使用已知的标记格式标记早期提交,然后使用git describe和--match选项来描述相对于已知标记的当前HEAD。然后,我们可以按原样使用git describe的结果,或者如果我们确实只想要一个数字,则可以使用正则表达式将数字从标记中切出。
假设我们从不回退分支,那么后续提交的次数将始终标识分支历史中的唯一点。
例如(使用bash或者类似工具)
# make an annotated tag to an early build in the repository: git tag -a build-origin "$some_old_commitid" # describe the current HEAD against this tag and pull out a build number expr "$(git describe --match build-origin)" : 'build-origin-\([0-9]*\)-g'
我们可能知道,git计算一个唯一标识历史记录节点的哈希(数字)。尽管并没有严格增加使用它们,但似乎已经足够了。 (更好的是,它们始终与源相对应,因此,如果我们具有哈希,则具有相同的代码。)它们是很大的数字,但是大多数情况下,我们可以使用6个左右的前导数字来获得。
例如,
That bug was fixed at 064f2ea...
我建议使用git describe的建议。只要我们拥有合理的版本控制策略,并且我们对存储库没有任何疯狂的事情,则git describe`始终是单调的(至少在修订历史记录是DAG而不是DAG的情况下,是尽可能单调的)。树)和独特。
一点示范:
git init git commit --allow-empty -m'Commit One.' git tag -a -m'Tag One.' 1.2.3 git describe # => 1.2.3 git commit --allow-empty -m'Commit Two.' git describe # => 1.2.3-1-gaac161d git commit --allow-empty -m'Commit Three.' git describe # => 1.2.3-2-g462715d git tag -a -m'Tag Two.' 2.0.0 git describe # => 2.0.0
git describe`的输出包含以下组件:
- 我们要求描述的提交中可获得的最新标签
- 提交和标记之间的提交次数(如果非零)
- 提交的(缩写)ID(如果#2不为零)
#2是使输出单调的原因,#3是使输出单调的原因。 #2和#3被省略,当commit是标签时,使git describe`也适用于生产版本。
使用Mercurial,我们可以使用以下命令:
# get the parents id, the local revision number and the tags [yjost@myhost:~/my-repo]$ hg id -nibt 03b6399bc32b+ 23716+ default tip
见hg识别