如何获取Git提交计数?


752

我想获取我的Git存储库的提交次数,有点像SVN版本号。

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

我目前在Unix / Cygwin / msysGit上确实喜欢这样:

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

但是我觉得这有点hack。

有更好的方法吗?如果我实际上wc甚至不需要Git,那将很酷,因此它可以在裸机上运行。只需读取文件或目录结构...


1
您可能会在这里找到有趣的答案:修订版本号的git等效项是什么?
塞巴斯蒂安·瓦雷特

190
git rev-list HEAD --count git rev-list
Jake Berger

14
@jberger:我认为您的评论应转换为答案。
utapyngo

@utapyngo:给出其他13个答案,我知道它会被掩埋。我已经贴在这里了
杰克·伯杰

@jberger,此答案不适用于git1.7.0。
沃拉克

Answers:


1159

要获取修订的提交计数(HEAD,,master提交哈希):

git rev-list --count <revision>

要获取所有分支的提交计数:

git rev-list --all --count

我建议不要将其用作构建标识符,但是,如果必须这样做,最好将计数用于构建的分支。这样,同一修订版将始终具有相同的编号。如果将计数用于所有分支,则其他分支上的活动可能会更改该数字。


27
git shortlog | grep -E '^[ ]+\w+' | wc -l如果要获取总数,并且git shortlog | grep -E '^[^ ]'要获取每个贡献者的提交数量。
skalee 2011年

2
感谢您指出wc -l。极简主义FTW。我将其合并到我的答案中。
本杰明·阿特金

17
该解决方案既笨拙(类似于git log --pretty=format:'' | wc -l原始问题中给出的方法)又是不正确的:您可以通过反转match(git shortlog | grep -Ev '^[ ]+\w+')并看到例如不包含任何消息的提交(即“ <none>”)来进行查看。使用git rev-list HEAD --count既简洁又准确。
2013年

17
@BenAtkin:我很抱歉;我的意图不是冒犯,而只是事实。关于响应日期的时间点。当时,您的解决方案很可能是最好的解决方案。但是,我支持我的声明,git rev-list HEAD --count即现在这是一个更好的解决方案。
2013年

3
还添加了一个答案,并且也适用于旧版本:git log --oneline | wc -l
Jimmy Kane 2014年

155

git shortlog 是一种方式。


5
泰 当计算范围内的提交时,这对我有用。git shortlog sha1..sha2
RJFalconer 2011年

1
是的,git shortlog的第一行中包含提交次数。问题解决了。
罗伯特·马赛利

5
提交次数是按提交者分组的,不是很好。可以在git shortlog中计算行数,但是由于某种原因,在没有终端的情况下,这无法在ssh上运行(寻呼机?)。询问者的原始解决方案是最好的!git log --pretty =格式:''| wc -l
Sam Watkins'2

4
但是,我建议git rev-list HEAD --count而不是OP中给出的原始方法。在我的测试中,git log --pretty=format:'' | wc -l相差一个。
2013年

3
@ctrueden git log --oneline | wc -l不能被一个(OS X 10.8.5)关闭。
安迪·斯图尔特

111

git rev-list HEAD --count

git rev-list

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

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


100

此命令返回按提交者分组的提交计数:

git shortlog -s

输出:

14 John lennon
9  Janis Joplin

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


11
git shortlog本身不能解决提交总数的原始问题(未按作者分组)。使用git rev-list HEAD --count代替。
2013年

5
太棒了!您可以通过排序它| sort -n
穆赫辛

54

如果您正在为提交寻找唯一且仍易读的标识符,则git describe可能只是您的事情。


2
这可以工作,并且比定制算法更易于使用。+1
VonC

2
我不知道git描述。标签名称和sha1之间的这个小数字正是我想要的。谢谢。
Splo

2
看一下GIT-VERSION-GEN脚本及其在git仓库中的用法,以及Linux内核源代码中的类似脚本(以及它们在Makefile中的用法)。
JakubNarębski09年

这给出了唯一的,但不是增量ID。对我不起作用。但是,本·阿特金(Ben Atkin)的答案提供了提交次数,实际上,提交次数应该是递增的。亚伦·迪古拉(Aaron Digulla)的答案更加确定,但还需要更多工作。
JOM

2
是的,这是因为增量 ID 的概念对于分布式版本控制系统没有任何意义。
孟买

34

您不是第一个想到Git中“修订号”的人,但是' wc'非常危险,因为可以删除或压缩提交,并且可以重新查看历史记录。

“版本号”对于Subversion尤其重要,因为在合并的情况下是必需的(SVN1.5和1.6在此方面有所改进)。

您可能最终会获得一个预提交的挂钩,该挂钩将在注释中包含修订号,并且该算法不涉及查找分支的所有历史以确定正确的编号。

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

(正如Bombe的答案所指出的那样,Git实际上具有自己的算法,该算法基于最新的标签,加上提交次数,再加上一点SHA-1密钥)。如果对您有用,您应该看到(并赞扬)他的答案。


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

这样,“关于”框将如下所示:

关于盒子

应用程序编号是提交的一部分,但是在打包过程中会生成“应用程序的“信息”文件”,从而将应用程序内部版本号有效地链接到技术修订版ID


2
我已经更新了脚本以与Xcode 3一起使用。您可以从gist.github.com/208825中获取最新版本。
阿比森

34

你可以使用:

git shortlog -s -n

结果:

 827  user one
    15  user two
     2  Gest 

22

一种简单的方法是:

 git log --oneline | wc -l

oneline 确保做到这一点。


1
无法将“ wc”识别为内部或外部命令,可操作程序或批处理文件。
2015年

那么您正在使用什么系统?是UNIX吗?/
Jimmy Kane 2015年

1
如果您有成千上万次提交,这似乎也更快。所有其他命令花费太多时间。
Danny Coulombe

21

要将其放入变量,最简单的方法是:

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

5
确实,使用的git rev-list是正确的工具,而不是git log像其他人所说的那样。
2011年

1
要计算沿袭到达HEAD的提交次数:git rev-list --first-parent | wc -l
200_success,2013年

你并不需要wc -l只使用--count开关:git rev-list --all --count
slm

感谢@slm,我已经更新了答案。虽然,我怀疑原始答案比--count开关本身还旧。
John Gietzen

@JohnGietzen-哦,是的,我想是8-),只是添加了此细节以提供帮助。
slm

17

Git shortlog是获取提交详细信息的一种方法:

git shortlog -s -n

这将给出提交次数,后跟作者姓名。-s选项删除作者所做的每个提交的所有提交消息。如果您还希望看到提交消息,请删除相同的选项。-n选项用于对整个列表进行排序。希望这可以帮助。


2
git shortlog本身不能解决提交总数的原始问题(未按作者分组)。使用git rev-list HEAD --count代替。
2013年



4

如果您只使用一个分支,例如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脚本为您做计数将是一个多平台的解决方案。

编辑:获取两次提交之间的计数:


我一直在寻找一个答案,该答案将显示如何获取两个任意修订之间的提交次数,而没有看到任何修订。

git rev-list --count [older-commit]..[newer-commit]

3

在构建过程中生成一个数字并将其写入文件。无论何时发布,请提交带有注释“ Build 147”(或当前的内部版本号)的文件。在正常开发期间不要提交文件。这样,您可以轻松在Git中的内部版本号和版本之间进行映射。


如果两个分布式开发人员这样做,他们的内部版本号不会定期发生冲突/相交吗?如果他们俩都在共享存储库的相同版本之间进行构建,或者如果仅其中一个更改未提交给共享存储库,则可能会发生冲突,该怎么办?不确定。
滚刀

当然可以,但冲突会告诉您该怎么做:只需与另一个人交谈或始终使用更大的号码即可。切记:许多数字无法神奇地解决损坏的构建过程。只是提醒暗示您需要检查某些内容。
亚伦·迪古拉

1
嗯,是的,魔术的buildno.txt文件与其余的一起提交了。对于小型团队或大型团队避免并行构建的好方法。我能想到的唯一地方是,对于使用脚本语言(python)且不需要构建过程(指派一个人来进行构建)的大型团队来说,这可能效果不佳。
滚刀

3

在我们公司中,我们从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)


1

使用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的类似结果。从分支的签出运行时1234.13,如果在该分支上进行了13次提交,则会得到类似的信息。显然,这仅在您最多基于给定master修订版本的一个分支的情况下才有用。

--first-parent 可以添加到微数字中,以抑制仅合并其他分支而产生的某些提交,尽管这可能是不必要的。


1

你可以试试

git log --oneline | wc -l

或列出由存储库中的人员完成的所有提交

git shortlog -s

1

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

如果将此添加到配置中,则只需引用命令即可;

git count



0

怎么样alias

alias gc="git rev-list --all --count"      #Or whatever name you wish
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.