如何获取Git提交计数?

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

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

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

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

但我觉得这有点像黑客。

有更好的方法吗?如果我真的不需要wc甚至Git,那就太酷了,所以它可以在裸Windows上工作。只需读取文件或目录结构…

397793 次浏览

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

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

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

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

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


为了说明Aaron的主意,您也可以将Git提交哈希附加到应用程序的“info”文件中与您的应用程序一起分发。

这样,about框看起来像:

关于盒子

应用程序编号是提交的一部分,但“应用程序的“信息”文件”是在打包过程中生成的,有效地将适用构建编号链接到技术版本id

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

如果您正在为提交寻找一个唯一且仍然非常可读的标识符,那么git描述可能就是您的最佳选择。

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

git reg-parse--短HEAD

git shortlog是一种方式。

获取修订版的提交计数(HEADmaster、提交哈希):

git rev-list --count <revision>

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

git rev-list --all --count

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

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

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

我以前用的是:

git log | grep "^commit" | wc -l

很简单,但它奏效了。

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

git shortlog -s

输出:

14 John lennon9  Janis Joplin

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

如果你只使用一个分支,比如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]

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

git shortlog -s -n

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

git rev-list HEAD --count

git rev-list//文件夹

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

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

一个简单的方法是:

 git log --oneline | wc -l

oneline确保了这一点。

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

使用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添加到微号以抑制仅由合并其他分支引起的一些提交,尽管这可能是不必要的。

像这样使用git短日志

git shortlog -sn

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

#按提交显示贡献者别名gcall="git短日志-sn"

你可以试试

git log --oneline | wc -l

或列出存储库中贡献人员所做的所有提交

git shortlog -s

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

如果您将其添加到您的配置中,您可以引用该命令;

git count

你只能使用:

git shortlog -s -n

结果:

 827  user one15  user two2  Gest

做一个alias怎么样?

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

git shortlog本身并没有解决提交总数的原始问题(未按作者分组)

这是真的,git rev-list HEAD--count仍然是最简单的答案。

但是,在Git 2.29(2020年第四季度)中,“git shortlogman)变得更加精确。
它已被教导根据拖车行的内容进行组提交,如“Reviewed-by:”,“Coauthored-by:”等。

请参阅提交63d24fa提交56d5dde提交87abb96提交f17b0b9提交47beb37提交f0939a0提交92338c4(2020年9月27日)和提交45d93eb(2020年9月25日)通过杰夫·金(#0)(由Junio C Hamano----#0----合并于提交2fa8aac,04 Oct 2020)

shortlog:允许指定多个组

签名人:Jeff King

现在shortlog支持从预告片中读取,组合来自多个预告片或预告片和作者之间的计数可能很有用。
这可以通过后处理多次运行的输出手动完成,但确保每个名称/提交对只计数一次是非常重要的。

这个补丁教短日志在命令行上接受多个--group选项,并从所有这些选项中提取数据。

这使得可以运行:

git shortlog -ns --group=author --group=trailer:co-authored-by

获得一个同样计算作者和共同作者的短日志。

实现非常简单。“group”枚举变成一个位字段,预告片键变成一个列表。
我没有费心实现从标准输入读取的多组语义学。这是可能的,但是现有的匹配代码使它变得尴尬,我怀疑是否有人关心。

我们用于预告片的重复抑制现在也涵盖了作者和提交者(尽管在非预告片单组模式下,我们可以跳过哈希插入和查找,因为我们每次提交只能看到一个值)。

有一个微妙之处:我们现在关心没有设置组位的情况(在这种情况下,我们默认显示作者)。
builtin/log.c中的调用者需要适应以明确询问作者,而不是依赖shortlog_init()。使用一些体操可以使其保持原样工作,但对于单个调用者来说不值得。

git shortlog现在包含在其手册页中:

--group=<type>

基于<type>的组提交。如果没有--group选项指定,默认值为author<type>是以下之一:

  • author,提交按作者分组
  • committer,提交按提交者分组(与-c相同)

这是--group=committer的别名。

git shortlog现在也包含在其手册页中:

如果多次指定--group,则每次提交都会计数值(但同样,该提交中每个唯一值仅一次)。对于例如,git shortlog --group=author --group=trailer:co-authored-by包括作者和合著者。

以下命令打印当前分支上的提交总数。

git shortlog -s -n  | awk '{ sum += $1; } END { print sum; }' "$@"

它由两部分组成:

  1. 打印按作者分组的日志总数(git shortlog -s -n

    示例输出

      1445  John C1398  Tom D1376  Chrsitopher P166  Justin T166  You
  2. 求和每个作者的总提交次数,即每行的第一个参数,并打印结果(awk '{ sum += $1; } END { print sum; }' "$@"

    使用与上面相同的示例,它将求和1445 + 1398 + 1376 + 166 + 166。因此输出将是:

      4,551

有几种很酷的方法可以做到这一点-

  • 第一种方法

git shortlog -s

此命令打印为repo做出贡献的所有用户的提交计数列表。

956 Pankaj Tanwar235 The Ninja540 The Hardcore Geek664 The Ever Shining Star984 The Experienced Man

简单地说,要获得总提交数-

git shortlog -s | grep "Pankaj Tanwar"

它打印-

956 Pankaj Tanwar
  • 另一种清洁和凉爽的方法是-
git rev-list HEAD --author="Pankaj Tanwar" --count

要计算贡献的代码总行和引发的总拉取请求,请选中这个博客