29

现在,我们正在使用 Perforce 进行版本控制。它有一个方便的特性,即严格增加的更改编号,我们可以使用它来引用构建,例如“如果您的构建至少为 44902,您将获得错误修复”。

我想改用分布式系统(可能是 git),以便更轻松地进行分支和在家工作。(Perforce 完全可以实现这两者,但 git 工作流有一些优势。)因此,尽管“附属开发”将是分布式的,而不是指通用的修订顺序,但我们仍然会维护一个主 git 存储库,所有更改都会需要在创建构建之前输入。

保留严格增加的构建 ID 的最佳方法是什么?我能想到的最直接的方法是有某种 post-commit 钩子,只要主 repo 更新就会触发,它会注册(哈希)新树对象(或提交对象?我是新手git) 带有一个分发 id 的集中式数据库。(我说“数据库”,但我可能会用 git 标签来做,只是寻找下一个可用的标签号或其他东西。所以“数据库”实际上是 .git/refs/tags/build-id/。 )

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

4

8 回答 8

30

可以生成与当前提交对应的单调递增数字

git log --pretty=oneline | wc -l

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

这种方法比 更好git describe,因为它不需要您添加任何标签,并且它会自动处理合并。

变基可能会出现问题,但是变基无论如何都是“危险的”操作。

于 2013-02-21T08:42:00.380 回答
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 非零)

#2 是使输出单调的原因,#3 是使其独特的原因。#2 和#3 省略,当commit标签时,git describe也适用于生产版本。

于 2008-09-24T00:35:04.167 回答
8
    git rev-list BRANCHNAME --count

这比资源密集型要少得多

    git log --pretty=oneline | wc -l
于 2014-02-27T23:32:03.833 回答
4

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

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

于 2008-09-23T18:05:00.033 回答
2

你应该调查一下git describe。它给出了一个唯一的字符串,该字符串根据最新的注释标签、自该标签以来的提交次数和分支头部的缩写提交 id 来描述当前分支(或任何传递的提交 id)。

大概你有一个分支来执行受控的构建版本。在这种情况下,我将使用已知标记格式标记早期提交,然后使用带有 --match 选项的 git describe 来描述相对于已知标记的当前 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'
于 2008-09-23T20:17:41.290 回答
1

我会使用“标签”每当您成功(甚至不成功)构建时创建一个标签,您将能够永远识别该构建。它并不完全相同,但它确实提供了这些内部版本号,同时仍然提供了分布式开发的好处。

于 2008-09-23T17:37:27.820 回答
0

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

例如,

该错误已在 064f2ea 处修复...

于 2008-09-24T00:03:18.127 回答
0

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

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

汞识别

于 2009-06-26T12:48:35.387 回答