我想获得Git存储库的提交数量,有点像SVN的修订号。

我们的目标是将其用作唯一的、递增的构建号。

我目前这样做,在Unix/Cygwin/msysGit上:

git log --pretty=format:'' | wc -l

但我觉得它有点过时了。

有更好的办法吗?如果我实际上不需要wc甚至Git,那么它就可以在裸Windows上工作,那就太棒了。只要读取一个文件或目录结构…


当前回答

使用Bash语法,

$(git rev-list --count HEAD)

对于纯线性历史来说还好。如果你有时也想从分支中获得“数字”(基于master),考虑:

$(git rev-list --count $(git merge-base master HEAD)).$(git rev-list --count ^master HEAD)

当从master签出运行时,您得到的只是1234.0或类似的结果。当从分支的签出运行时,如果在该分支上已经进行了13次提交,那么您将得到类似于1234.13的结果。显然,这只在你基于一个给定的主修订的最多一个分支时有用。

first-parent可以加入到微号中,以抑制一些合并其他分支时产生的提交,尽管这可能是不必要的。

其他回答

像这样使用git shortlog

git shortlog -sec

或创建别名(用于基于ZSH的终端)

#按提交量显示贡献者 别名gcall="git shortlog -sn"

在构建期间生成一个数字并将其写入文件。每当您发布一个版本时,提交该文件并附上注释“Build 147”(或者当前的版本号)。不要在正常开发期间提交文件。通过这种方式,您可以轻松地在Git中的构建号和版本之间进行映射。

做一个别名怎么样?

alias gc="git rev-list --all --count"      #Or whatever name you wish

在我们公司,我们从SVN转移到Git。缺乏修订数字是一个大问题!

执行git svn clone,然后用它的svn修订号标记上一次提交的svn:

export hr=`git svn find-rev HEAD`
git tag "$hr" -f HEAD

然后你可以在的帮助下得到修订号

git describe --tags --long

这个命令会给出如下内容:

7603-3-g7f4610d

含义:最后一个标签是7603 -这是SVN的修订。3 -是从它提交的计数。我们需要把它们加起来。

因此,修订号可以通过以下脚本计算:

expr $(git describe --tags --long | cut -d '-' -f 1) + $(git describe --tags --long | cut -d '-' -f 2)

你不是第一个在Git中考虑“修订号”的人,但是“wc”是相当危险的,因为commit可以被删除或压缩,历史可以被重新审视。

“修订号”对于Subversion来说尤其重要,因为在合并时需要它(SVN1.5和1.6在这方面有所改进)。

您可能最终得到一个预提交钩子,它将在注释中包含一个修订号,而算法不需要查找分支的所有历史记录来确定正确的数字。

Bazaar实际上提出了这样一个算法,对于您想要做的事情来说,它可能是一个很好的起点。

(正如Bombe的回答所指出的,Git实际上有自己的算法,基于最新的标记,加上提交的数量,再加上一点SHA-1密钥)。如果他的回答对你有用,你应该看看(并投票)。


为了说明Aaron的想法,您还可以将Git提交散列附加到随应用程序分发的应用程序的“info”文件中。

这样,about框看起来就像这样:

应用程序编号是提交的一部分,但“应用程序的“信息”文件”是在打包过程中生成的,有效地将应用程序构建号与技术修订id链接起来。