我如何得到Git的提交计数?

我想得到我的Git仓库提交的数量,有点像SVN修订版本号。

目标是将其用作唯一的递增内部版本号。

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

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

但是我觉得这有点破绽。

有没有更好的方法来做到这一点? 如果我实际上不需要wc甚至Git,那将会很酷,所以它可以在一个光秃秃的Windows上运行。 只要阅读一个文件或目录结构…

获取修订的提交计数( HEADmaster ,commit hash):

 git rev-list --count <revision> 

要获得所有分支机构的提交计数:

 git rev-list --all --count 

我build议不要使用它作为构build标识符,但是如果你必须的话,最好使用你正在构build的分支的计数。 这样,相同的修订版本将始终具有相同的编号。 如果您使用所有分行的计数,其他分行的活动可能会更改数字。

git shortlog是一种方法。

git rev-list HEAD --count

git rev-list

git rev-list <commit> :列出可以通过跟踪来自给定提交(在这种情况下为HEAD )的父链接到达的提交。

--count :打印一个数字,说明将有多less提交将被列出,并禁止所有其他输出。

这个命令返回提交者分组提交的数量:

 git shortlog -s git shortlog -s 14 John lennon 9 Janis Joplin 

如果你正在寻找一个独特的,仍然很可读的提交标识符, git描述可能只是你的事情。

你不是第一个想到Git中的“修订号” ,但是“ wc ”是相当危险的,因为commit可以被删除或者压扁,并且历史会被重新审视。

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

你可能会得到一个预先提交的钩子,这个钩子会在注释中包含一个修订版本号, 而不涉及查找分支的所有历史logging来确定正确的编号。

市集实际上提出了这样的algorithm ,这可能是你想要做的一个很好的起点。

(正如Bombe的回答指出的那样,Git实际上有一个自己的algorithm,基于最新的标签,外加提交的数量,加上一点SHA-1密钥)。 你应该看到(并upvote)他的答案,如果它适合你。


为了说明Aaron的想法 ,您还可以将Git提交哈希追加到应用程序的“info”文件中,这个文件将随应用程序一起分发。

那样的话,关于这个盒子就像是:

关于框

应用程序编号是提交的一部分,但“应用程序”信息“文件”是在打包过程中生成的,有效地将应用程序的内部版本号与技术修订版本号相关联。

要把它变成一个variables,最简单的方法是:

 export GIT_REV_COUNT=`git rev-list --all --count` 

Git shortlog是获取提交细节的一种方法:

 git shortlog -s -n 

这将提供作者姓名之后的提交数量。 -s选项删除作者所做的每个提交的所有提交消息。 如果您希望看到提交消息,则删除相同的选项。 -n选项用于sorting整个列表。 希望这可以帮助。

一个简单的方法是:

  git log --oneline | wc -l 

oneline确保。

git rev-parse –short HEAD

有一个很好的帮手脚本,Git人用它来帮助生成一个基于Git描述的有用的版本号。 我将显示脚本并在我的答案中解释如何将当前提交ID包含在Git项目的文件中?

在生成过程中生成一个数字并将其写入文件。 每当你发布一个版本,提交该文件的评论“构build147”(或任何内部版本号目前是)。 在正常开发过程中不要提交文件。 通过这种方式,您可以轻松地在Git中构build编号和版本之间的映射。

如果你只是使用一个分支,比如master,我认为这会很好:

 git rev-list --full-history --all | wc -l 

这只会输出一个数字。 你可以将它别名为

 git revno 

让事情真的很方便。 为此,编辑你的.git/config文件并添加它:

 [alias] revno = "!git rev-list --full-history --all | wc -l" 

这在Windows上不起作用。 我不知道该操作系统的“wc”的等价物,但是编写一个Python脚本来为你计数将是一个多平台的解决scheme。

在我们公司,我们从SVN转移到了Git。 缺less修订号码是一个大问题!

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 log | grep "^commit" | wc -l 

简单,但它的工作。

使用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 。 显然,只有在给定的master版本中最多只有一个分支的情况下才有用。

--first-parent可以将--first-parent添加到微数中,以抑制仅从合并其他分支引起的一些提交,尽pipe这可能是不必要的。

你可以试试

 git log --oneline | wc -l 

或者列出仓库中贡献人员所做的所有提交

 git shortlog -s 

git config --global alias.count 'rev-list --all --count'

如果你把这个添加到你的configuration中,你可以参考命令;

git count

像这样使用git shortlog

git shortlog -sn

或者创build一个别名(对于基于ZSH的terminal)

# show contributors by commits alias gcall="git shortlog -sn"