885

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

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

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

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

但我觉得这有点骇人听闻。

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

4

24 回答 24

1374

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

git rev-list --count <revision>

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

git rev-list --all --count

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

于 2010-10-31T03:21:03.933 回答
189

git shortlog是一种方式。

于 2010-04-23T17:28:29.567 回答
137

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

git shortlog -s

输出:

14 John lennon
9  Janis Joplin

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

于 2011-11-14T07:52:03.313 回答
128

git rev-list HEAD --count

git rev 列表

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

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

于 2013-03-09T19:43:54.667 回答
55

如果您正在为提交寻找一个唯一且仍然非常易读的标识符,那么git describe可能正是您的理想之选。

于 2009-03-24T14:08:56.987 回答
42

你可以使用:

git shortlog -s -n

结果 :

 827  user one
    15  user two
     2  Gest 
于 2017-12-26T09:09:13.137 回答
34

您不是第一个在 Git 中考虑“修订号”的人,但 ' wc' 非常危险,因为提交可以被擦除或压缩,并且可以重新访问历史。

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

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

Bazaar实际上想出了这样一个算法,它可能是你想做的一个很好的起点。

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


为了说明Aaron 的想法,您还可以将 Git 提交哈希附加到您与应用程序一起分发的应用程序的“信息”文件中。

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

关于盒子

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

于 2009-03-24T13:54:57.520 回答
23

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

export GIT_REV_COUNT=`git rev-list --all --count`
于 2011-07-15T21:52:44.593 回答
22

一个简单的方法是:

 git log --oneline | wc -l

oneline确保这一点。

于 2014-02-06T15:38:19.777 回答
18

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

git shortlog -s -n

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

于 2012-11-25T07:59:41.343 回答
10

如果您只使用一个分支,例如 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]
于 2012-10-26T14:50:50.813 回答
7

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

于 2009-03-24T15:22:54.173 回答
6

git rev-parse --short HEAD

于 2009-11-24T09:24:53.620 回答
3

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

于 2009-03-24T13:59:06.510 回答
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)
于 2014-06-11T11:05:11.337 回答
3

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

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

它由两部分组成:

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

    示例输出

      1445  John C
      1398  Tom D
      1376  Chrsitopher P
       166  Justin T
       166  You
    
  2. 总结每个作者的总提交数,即每行的第一个参数,并将结果打印出来(awk '{ sum += $1; } END { print sum; }' "$@"

    使用与上面相同的示例将总结1445 + 1398 + 1376 + 166 + 166。因此输出将是:

      4,551
    
于 2020-10-16T10:12:29.730 回答
2

我以前用的是:

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

简单但有效。

于 2011-07-31T14:24:39.840 回答
2

使用 Bash 语法,

$(git rev-list --count HEAD)

对于纯线性历史看起来不错。如果您有时还想从分支中获取“数字”(基于 off 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可以添加到微编号以抑制仅由合并其他分支引起的某些提交,尽管这可能是不必要的。

于 2014-09-17T20:51:30.220 回答
2

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

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

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

请参阅Jeff King的提交 63d24fa 、提交56d5dde提交 87abb96提交 f17b0b9提交 47beb37提交 f0939a0提交 92338c4(2020 年 9 月 27 日)和提交 45d93eb peff 2020 年 9 月 25 日
(由Junio C Hamano 合并gitster——提交 2fa8aac中,2020 年 10 月 4 日)

shortlog: 允许指定多个组

签字人:杰夫·金

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

这个补丁教 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 计算作者和共同作者。

于 2020-10-09T20:12:18.780 回答
2

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

  • 第一种方法

git shortlog -s

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

956 Pankaj Tanwar
235 The Ninja
540 The Hardcore Geek
664 The Ever Shining Star
984 The Experienced Man

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

git shortlog -s | grep "Pankaj Tanwar"

它打印 -

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

要计算贡献的代码总行数和提出的总拉取请求,请查看此博客

于 2022-01-18T07:26:53.457 回答
1

你可以试试

git log --oneline | wc -l

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

git shortlog -s
于 2016-11-15T10:24:03.343 回答
1

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

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

git count

于 2017-09-11T09:46:13.677 回答
1

制作一个怎么样alias

alias gc="git rev-list --all --count"      #Or whatever name you wish
于 2020-01-23T15:14:30.473 回答
0

像这样使用 git shortlog

git shortlog -sn

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

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

于 2015-11-05T14:01:38.953 回答