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

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

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

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

有帮助吗?

解决方案

我的第二个建议是使用 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 也适用于生产版本。

其他提示

可以使用

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

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

这种方法优于 git describe ,因为它不需要你添加任何标签,它会自动处理合并。

它可能会遇到拐点问题,但是反弹是“危险的”。无论如何操作。

    git rev-list BRANCHNAME --count

这比

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

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

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

您应该调查 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'

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

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

例如,

  

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

使用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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top