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

时间:2008-09-23 17:23:33

标签: git build-process dvcs

目前,我们正在使用Perforce进行版本控制。它具有我们可以用来引用构建的严格增加的更改编号的便利功能,例如“如果您的构建版本至少为44902,您将获得错误修复”。

我想切换到使用分布式系统(可能是git),以便更容易分支和在家工作。 (Perforce完全可以实现这两种功能,但是git工作流程有一些优势。)因此,尽管“支流开发”将被分发而不是参考通用的修订版,但我们仍然会保留一个主要的git repo,所有更改都会需要在创建构建之前加入。

保持严格增加构建ID的最佳方法是什么?我能想到的最简单的方法是使用某种post-commit钩子,每当主repo更新时它就会触发,并且它注册(哈希)新树对象(或者提交对象?我是新手git)有一个集中的数据库,可以分发ID。 (我说“数据库”,但我可能会用git标签来做,只是寻找下一个可用的标签号或什么。所以“数据库”真的是.git / refs / tags / build-id /。 )

这是可行的,但我想知道是否有更简单,或已经实施,或标准/“最佳实践”的方式来实现这一目标。

8 个答案:

答案 0 :(得分:30)

可以使用

生成与当前提交相对应的单调递增数字
git log --pretty=oneline | wc -l

返回一个数字。您还可以将当前sha1附加到该数字,以添加唯一性。

此方法优于git describe,因为它不需要您添加任何标记,并且它会自动处理合并。

它可能会遇到拐点问题,但无论如何都要进行“危险”操作。

答案 1 :(得分:28)

我接下来建议使用git describe。如果您有一个理智的版本控制策略,并且您没有对您的存储库做任何疯狂的事情,git describe将始终是单调的(至少像您一样单调,当您的修订历史是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的输出包含以下组件:

  1. 您要求描述的提交中可以访问的最新标记
  2. 提交和标记之间的提交数量(如果非零)
  3. 提交的(缩写)id(如果#2非零)
  4. #2是使输出单调的原因,#3是使其独特的原因。当提交 标记时,#2和#3被省略,使git describe也适用于生产版本。

答案 2 :(得分:8)

    git rev-list BRANCHNAME --count

这比

要少得多
    git log --pretty=oneline | wc -l

答案 3 :(得分:4)

git tag可能足以满足您的需求。选择每个人都同意不使用的标记格式。

注意:在本地标记时,git push不会更新服务器上的标记。请使用git push --tags

答案 4 :(得分:2)

您应该调查git describe。它提供了一个唯一的字符串,用于描述当前分支(或任何传递的提交ID),包括最新的注释标记,自该标记以来的提交数量以及分支头部的缩写提交ID。

据推测,您有一个分支可以执行受控构建版本。在这种情况下,我会使用已知的标记格式标记早期提交,然后使用git describe和--match选项来描述相对于已知标记的当前HEAD。然后你可以按原样使用git describe的结果,或者如果你真的只想要一个数字,你可以使用正则表达式从标签中删除数字。

假设您永远不会回退分支,以下提交的数量将始终标识分支历史记录中的唯一点。

e.g。 (使用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'

答案 5 :(得分:1)

我使用“标签”只要您成功(甚至不成功)构建,就可以创建标签,并且您将能够永久识别该构建。它并不完全相同,但它确实提供了这些构建数量,同时仍然提供了分布式开发的好处。

答案 6 :(得分:0)

您可能知道,git计算唯一标识历史节点的哈希(数字)。使用这些,虽然它们没有严格增加,但似乎它已经足够好了。 (更好的是,它们始终对应于源,所以如果你有哈希,你有相同的代码。)它们是大数字,但大多数你可以得到6个左右领先数字。

例如,

  

该错误已修复为064f2ea ......

答案 7 :(得分:0)

使用Mercurial,您可以使用以下命令:

# get the parents id, the local revision number and the tags
[yjost@myhost:~/my-repo]$ hg id -nibt
03b6399bc32b+ 23716+ default tip

请参阅hg identify