我如何获得Git提交计数?

时间:2009-03-24 13:38:55

标签: git build-process revision

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

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

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

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

但我觉得这有点像黑客。

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

23 个答案:

答案 0 :(得分:1019)

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

git rev-list --count <revision>

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

git rev-list --all --count

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

答案 1 :(得分:140)

git shortlog是单向的。

答案 2 :(得分:100)

git rev-list HEAD --count

git rev-list

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

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

答案 3 :(得分:74)

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

git shortlog -s

git shortlog -s
14 John lennon
9  Janis Joplin

答案 4 :(得分:53)

如果您正在寻找一个唯一且仍然可读的提交标识符,git describe可能只适合您。

答案 5 :(得分:32)

你不是第一个考虑"revision number" in Git的人,但是'wc'是非常危险的,因为提交可以被删除或压缩,并重新审视历史。

“版本号”对于Subversion尤其重要,因为它was needed in case of merge(SVN1.5和1.6在这方面有所改进)。

您最终可能会使用预提交挂钩,其中包含评论中的修订号,其中算法不涉及查找分支的所有历史记录确定正确的号码。

Bazaar实际上提出了such an algorithm ,这可能是您想要做的一个很好的起点。

(正如Bombe's answer所指出的,Git实际上有一个自己的算法,基于最新的标签,加上提交的数量,再加上一些SHA-1密钥)。如果它适合你,你应该看到(并且赞成)他的答案。


为了说明Aaron's idea,您还可以append the Git commit hash into an application’s "info" file分发您的申请。

这样,about框看起来像是:

About box

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

答案 6 :(得分:26)

你可以使用:

git shortlog -s -n

结果:

 827  user one
    15  user two
     2  Gest 

答案 7 :(得分:21)

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

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

答案 8 :(得分:20)

一个简单的方法是:

 git log --oneline | wc -l

oneline确保了。

答案 9 :(得分:15)

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

git shortlog -s -n

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

答案 10 :(得分:8)

git rev-parse --short HEAD

答案 11 :(得分:7)

有一个很好的帮助程序脚本,Git人员用它来帮助生成基于Git描述的有用版本号。我会在 How would you include the current commit id in a Git project's files? 的回答中显示脚本并解释它。

答案 12 :(得分: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脚本来为你进行计数将是一个多平台的解决方案。

答案 13 :(得分:3)

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

答案 14 :(得分: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)

答案 15 :(得分: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或类似内容。当从分支结账运行时,如果在该分支上进行了13次提交,则会得到1234.13之类的内容。显然,只有在基于给定master版本的最多一个分支的基础上,这才有用。

可以将

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

答案 16 :(得分:1)

你可以尝试

var facebookSignIn = Meteor.user().services.facebook;

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

git log --oneline | wc -l

答案 17 :(得分:1)

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

如果将其添加到配置中,则只需引用该命令;

git count

答案 18 :(得分:1)

我以前使用的是:

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

简单但有效。

答案 19 :(得分:1)

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

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

但是,在Git 2.29(2020年第四季度)中,“ git shortlogman变得更加精确。
它被教导可以通过预告行的内容对提交进行分组 ,例如“ Reviewed-by:,“ Coauthored-by:”等。

请参见commit 63d24facommit 56d5ddecommit 87abb96commit f17b0b9commit 47beb37commit f0939a0commit 92338c4(2020年9月27日)和commit 45d93ebJeff King (peff)(2020年9月25日)。
(由Junio C Hamano -- gitster --commit 2fa8aac中合并,2020年10月4日)

shortlog:允许指定多个组

签名人:杰夫·金

现在shortlog支持阅读预告片,将多个预告片或预告片与作者之间的计数合并起来很有用。
可以通过对多个运行的输出进行后期处理来手动完成此操作,但是要确保每个名称/提交对仅被计数一次,这并非易事。

此修补程序教导了shortlog在命令行上接受多个--group选项,并从所有选项中提取数据。

这使得可以运行:

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

获得简短记录作者和合著者人数的

大多数情况下实现起来很简单。 “ group”枚举成为一个位域,而预告片键成为一个列表。
我不费吹灰之力地实现了从stdin读取的多组语义。可以这样做,但是现有的匹配代码使它很尴尬,我怀疑有人在乎。

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

有一个微妙之处:现在我们关心的是没有设置组位的情况(在这种情况下,我们默认显示作者)。
需要调整builtin/log.c中的调用方,以明确地询问作者,而不是依赖shortlog_init()。某些体操运动员有可能保持这种状态不变,但对于一个呼叫者来说却不值得。

git shortlog现在包含在其man page中:

--group=<type>

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

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

这是--group=committer的别名。

git shortlog现在也包含在其man page中:

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

答案 20 :(得分:1)

以下命令显示当前分支上的提交总数。

Example Value 

它由两部分组成:

  1. 打印按作者(git shortlog -s -n | awk '{ sum += $1; } END { print sum; }' "$@" )分组的日志总数

    示例输出

    git shortlog -s -n
  2. 总结每个作者的总提交数量,即每行的第一个参数,然后打印出结果( 1445 John C 1398 Tom D 1376 Chrsitopher P 166 Justin T 166 You

    使用与上述相同的示例,它将总结为awk '{ sum += $1; } END { print sum; }' "$@"。因此输出将是:

    1445 + 1398 + 1376 + 166 + 166

答案 21 :(得分:0)

像这样使用git shortlog

git shortlog -sn

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

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

答案 22 :(得分:0)

制作alias怎么样?

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