现在,我们正在使用Perforce进行版本控制.它有一个方便的功能,我们可以用来引用构建的严格增加的更改号,例如"如果你的构建至少是44902,你将得到错误修复".
我想切换到使用分布式系统(可能是git),以便更容易分支和在家工作.(Perforce完全可以实现这两个目标,但是git工作流程有一些优势.)因此,尽管"支流开发"将被分发而不是参考通用的修订版,但我们仍然会维护一个主要的git repo,所有更改都会需要在创建构建之前加入.
保存严格增加的构建ID的最佳方法是什么?我能想到的最简单的方法是使用某种post-commit钩子,每当主repo更新时它就会触发,并且它注册(哈希)新树对象(或者提交对象?我是新手git)有一个集中的数据库,可以分发ID.(我说"数据库",但我可能会用git标签来做,只是寻找下一个可用的标签号或什么.所以"数据库"真的是.git/refs/tags/build-id /. )
这是可行的,但我想知道是否有更简单,或已经实现,或标准/"最佳实践"的方式来实现这一点.
可以生成与当前提交相对应的单调递增的数字
git log --pretty=oneline | wc -l
返回一个数字.您还可以将当前sha1附加到该数字,以添加唯一性.
这种方法优于git describe
,因为它不需要您添加任何标记,它会自动处理合并.
它可能会遇到拐点问题,但无论如何都要进行"危险"操作.
我第二个使用的建议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
包含以下组件:
您要求描述的提交中可以访问的最新标记
提交和标记之间的提交数量(如果非零)
提交的(缩写)id(如果#2非零)
#2是使输出单调的原因,#3是使其独特的原因.当提交是标记时,省略#2和#3 ,git describe
也适用于生产版本.
git rev-list BRANCHNAME --count
这比资源密集程度低得多
git log --pretty=oneline | wc -l