使用分布式版本控制时的构建排序

时间:2020-03-06 14:36:47  来源:igfitidea点击:

现在,我们正在使用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识别