我该如何获取Git提交次数?

999

我想要获取我的Git仓库的提交次数,类似于SVN版本号。

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

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

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

但我感觉这有点像是一种hack。

有没有更好的方法?如果我不需要wc甚至Git,那就太棒了,这样它就可以在裸露的Windows上运行。只需读取文件或目录结构即可...


2
你可能会在这里找到有趣的答案:什么是 Git 中相当于版本号的东西? - Sebastien Varrette
248
git rev-list HEAD --count git rev-list - Jake Berger
19
@jberger:我认为你的评论应该转换成回答。 - utapyngo
1
@utapyngo:鉴于其他13个答案,我知道它会被埋没。我已经在这里发布了它(https://dev59.com/UXRB5IYBdhLWcg3wQVSV#15315094)。 - Jake Berger
@jberger,这个答案对于git1.7.0不起作用。 - Vorac
26个回答

1528
获取修订版本的提交计数(HEAD,master,提交哈希):
git rev-list --count <revision>

获取所有分支的提交计数:
git rev-list --count --all

我建议不要使用这个作为构建标识符,但如果你必须使用,最好使用与你正在构建的分支相关的计数。这样,相同的修订版本将始终具有相同的编号。如果你对所有分支都使用计数,其他分支上的活动可能会改变编号。

38
如果你想获得总提交数,可以使用命令:git shortlog | grep -E '^[ ]+\w+' | wc -l。如果你想获取每个贡献者的提交数,可以使用命令:git shortlog | grep -E '^[^ ]' - skalee
2
感谢指出 wc -l。极简主义万岁。我已将其纳入我的答案中。 - Benjamin Atkin
20
这个解决方案既不太正规(类似于原问题中提到的“git log --pretty=format:'' | wc -l”方法),也不正确:通过反转匹配条件(git shortlog | grep -Ev '^[ ]+\w+'),可以看出即使没有消息的提交(即“<none>”)也不会被计算在内。使用git rev-list HEAD --count更简洁和准确。 - ctrueden
21
抱歉,我没有冒犯的意图,只是陈述事实。感谢指出我的回复日期。也许在当时,你的解决方案确实是最好的选择。但我仍然坚信现在使用 git rev-list HEAD --count 是更好的解决方案。 - ctrueden
3
也加上了一个答案,而且适用于旧版本:git log --oneline | wc -l - Jimmy Kane
显示剩余12条评论

206

git shortlog是其中一种方式。


9
谢谢。在计算范围内的提交次数时,这对我有用;git shortlog sha1..sha2 - RJFalconer
2
没错,git shortlog的第一行就有提交次数。问题解决了。 - Robert Massaioli
6
提交次数按提交者分组,不太好。可以在git shortlog中计算行数,但出于某种原因(分页器?)在没有终端的情况下通过ssh无法使用。提问者最初提供的解决方案是最好的!git log --pretty=format:'' | wc -l - Sam Watkins
我同意;git shortlog本身并不能解决原始问题,即总的提交次数(不按作者分组)。 - ctrueden
4
然而,我建议使用 git rev-list HEAD --count 而不是 OP 中给出的原始方法。在我的测试中, git log --pretty=format:'' | wc -l 的计数会多一个。 - ctrueden
4
“@ctrueden git log --oneline | wc -l在OS X 10.8.5上没有错(不比预期少一行)。” - Andy Stewart

167

该命令返回按提交者分组的提交次数:

git shortlog -s

输出:

14 John lennon
9  Janis Joplin

您可能想知道-s参数是--summary的缩写形式。


13
单独使用git shortlog不能回答原始问题中 总共 的提交次数(不按作者分组)。请使用git rev-list HEAD --count代替。 - ctrueden
8
太棒了!你也可以用“| sort -n”进行排序。 - Mohsen
1
@Mohsen 或者简单地使用 git shortlog -sn - luizfls

136

git rev-list HEAD --count

git rev-list

git rev-list <commit> : 列出由给定提交(在本例中为 HEAD)通过父链接可到达的提交。

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


58

如果您正在寻找一种独特而仍然易读的提交标识符,那么git describe可能正是您需要的。


2
那可能行得通,而且比自定义算法更易于使用。+1 - VonC
2
我之前不知道git describe。在标签名和sha1之间的这个小数字正是我正在寻找的。谢谢。 - Splo
2
看看GIT-VERSION-GEN脚本以及它如何在git存储库中使用,以及Linux内核源代码中类似的脚本(以及它们在Makefile中的使用方式)。 - Jakub Narębski
这会给出唯一的,但不是增量式的ID。对我来说不起作用。然而Ben Atkin的答案提供了提交计数,在实践中应该是增量式的。Aaron Digulla的答案更可靠,但也需要更多的工作。 - JOM
2
是的,这是因为“增量”ID的概念在分布式版本控制系统中毫无意义。 - Bombe
1
如果你得到了 fatal: No names found, cannot describe anything 的错误提示,那么你需要创建至少一个标签(计数将从该标签开始)。如果标签没有注释,你应该执行 git describe --tags 命令。 - user2518618

46

您可以直接使用:

git shortlog -s -n

结果:

 827  user one
    15  user two
     2  Gest 

1
我喜欢这个,它简洁并按提交次数排序。 - Jessica

34

你并不是第一个考虑在Git中使用"修订号码",但'wc'非常危险,因为提交可能会被删除或压缩,并且历史记录可能被修改。

"修订号码"在Subversion中尤其重要,因为在合并的情况下需要(SVN1.5和1.6已经在这方面有所改进)。

你可以使用预提交钩子将修订号码包含在注释中,并使用不涉及查找分支所有历史记录以确定正确号码的算法。

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

(正如Bombe的答案所指出的那样,Git实际上有一种自己的算法,基于最新的标签,加上提交数量,再加上SHA-1密钥的一部分)。如果这个算法适用于你,你应该查看(并点赞)他的回答。


为了阐述Aaron的想法,你还可以在你要分发的应用程序的“信息”文件中附加Git提交哈希值
这样,关于框将如下所示:

About box

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


2
我已更新我的脚本,以适用于Xcode 3。您可以从http://gist.github.com/208825获取最新版本。 - Abizern
有没有办法将合并的提交也计入统计?例如,如果您将10个提交压缩成1个提交,是否有办法将其视为10个提交而不是1个提交? - mfaani
@Honey,我认为仅使用git describe是不可能的。 - VonC

26
一个简单的方法是:
 git log --oneline | wc -l

oneline确保在同一行内显示。


1
'wc' 不被识别为内部或外部命令,可执行程序或批处理文件。 - user815693
你使用的是什么操作系统?是UNIX吗? - Jimmy Kane
1
如果你有成千上万的提交,这个看起来也更快。所有其他命令都需要太多时间。 - Chololoco

23

要将它存入变量中,最简单的方法是:

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

5
确实,git rev-list 是正确的工具,而不是像其他人说的 git log - Nayuki
1
要计算到达HEAD的衍生提交数量:git rev-list --first-parent | wc -l - 200_success
1
你不需要使用 wc -l 命令,只需使用 --count 开关:git rev-list --all --count - slm
谢谢@slm,我已更新答案。虽然,我怀疑原始答案比“--count”选项更旧。 - John Gietzen
@JohnGietzen - 噢,是的,我明白了 8-) ,只是添加这个细节以帮助。 - slm

19

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

git shortlog -s -n

这将显示提交次数和作者名称。-s选项会移除作者为每个提交所做的所有提交消息。如果您想查看提交消息,删除相同的选项即可。-n选项用于对整个列表进行排序。希望这可以帮到您。


3
仅仅使用git shortlog无法回答“总共”提交次数的问题(不按作者分组)。请改用git rev-list HEAD --count代替。 - ctrueden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接