ChatGPT解决这个技术问题 Extra ChatGPT

如何获得 Git 提交计数?

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

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

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

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

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

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

您可能会在这里找到有趣的答案:what is the git equivalent for revision number?
git rev-list HEAD --count git rev-list
@jberger:我认为您的评论应该转换为答案。
@utapyngo:鉴于其他 13 个答案,我知道它会被埋葬。我已经posted it here了。
@jberger,这个答案不适用于 git1.7.0。

4
4 revs

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

git rev-list --count <revision>

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

git rev-list --all --count

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


git shortlog | grep -E '^[ ]+\w+' | wc -l 如果您想获得总数,git shortlog | grep -E '^[^ ]' 如果您想获得每个贡献者的提交数。
感谢您指出wc -l。极简主义 FTW。我将它纳入我的答案。
这个解决方案既老套(类似于原始问题中给出的 git log --pretty=format:'' | wc -l 方法)并且不正确:您可以通过反转匹配(git shortlog | grep -Ev '^[ ]+\w+')并看到例如没有消息的提交(即“<none> ;") 不计算在内。使用 git rev-list HEAD --count 更加简洁和准确。
@BenAtkin:我很抱歉;我无意冒犯,只是事实。关于答复日期的要点。当时,您的解决方案很可能是最好的解决方案。但我坚持我的说法,即 git rev-list HEAD --count 现在是一个更好的解决方案。
也添加了答案,并且也适用于旧版本:git log --oneline | wc -l
R
Rayne

git shortlog 是一种方式。


泰。在计算范围内的提交时,这对我有用; git shortlog sha1..sha2
是的, git shortlog 的第一行包含提交的数量。问题解决了。
提交的数量是按提交者分组的,不太好。可以计算 git shortlog 中的行数,但是由于某种原因(寻呼机?),这在没有终端的 ssh 上不起作用。提问者的原始解决方案是最好的! git log --pretty=format:'' | wc -l
但是,我会建议 git rev-list HEAD --count 而不是 OP 中给出的原始方法。在我的测试中,git log --pretty=format:'' | wc -l 相差 1。
@ctrueden git log --oneline | wc -l 没有关闭一个(OS X 10.8.5)。
V
Valerio Bozz

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

git shortlog -s

输出:

14 John lennon
9  Janis Joplin

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


git shortlog 本身并不能解决 total 提交数(未按作者分组)的原始问题。请改用 git rev-list HEAD --count
惊人的!您也可以按 | sort -n 对其进行排序
@Mohsen 或只是 git shortlog -sn
J
Jake Berger

git rev-list HEAD --count

git rev-list

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

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


s
svrist

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


这可以工作,并且比定制算法更容易使用。 +1
我不知道 git 描述。标签名称和 sha1 之间的这个小数字正是我想要的。谢谢你。
查看 GIT-VERSION-GEN 脚本以及它在 git 存储库中的使用方式,以及 Linux 内核源代码中的类似脚本(以及它们在 Makefile 中的使用方式)。
是的,这是因为增量 ID 的概念对于分布式版本控制系统没有任何意义。
如果您获得 fatal: No names found, cannot describe anything,则需要创建至少一个标签(计数将从该标签开始)。如果标签没有注释,你应该做 git describe --tags
d
demenvil

你可以使用:

git shortlog -s -n

结果 :

 827  user one
    15  user two
     2  Gest 

P
Peter Mortensen

您不是第一个想到 "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随您的应用程序一起分发。

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

https://i.stack.imgur.com/xPr0b.png

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


我已更新我的脚本以使用 Xcode 3。您可以从 gist.github.com/208825 获取最新版本。
有什么方法可以让计数也包括压扁的提交?即,如果您将 10 次提交压缩为 1,有没有办法将其计为 10,而不是 1?
@Honey 我认为单独使用 git describe 是不可能的。
J
John Gietzen

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

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

事实上,git rev-list 是正确使用的工具,而不是像其他人所说的 git log
要计算谱系中到达 HEAD 的提交次数: git rev-list --first-parent | wc -l
您不需要 wc -l,只需使用 --count 开关:git rev-list --all --count
谢谢@slm,我已经更新了答案。虽然,我怀疑原始答案比 --count 开关本身更老。
@JohnGietzen - 哦,是的,我认为 8-),只是添加了这个细节来提供帮助。
P
Peter Mortensen

一个简单的方法是:

 git log --oneline | wc -l

oneline 确保了这一点。


'wc' 不是内部或外部命令、可运行程序或批处理文件。
嗯,你用的是什么系统?它是 UNIX 吗?/
如果您有数千个提交,这似乎也更快。所有其他命令都需要太多时间。
S
Sri Murthy Upadhyayula

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

git shortlog -s -n

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


git shortlog 本身并不能解决 total 提交数(未按作者分组)的原始问题。请改用 git rev-list HEAD --count
N
NuclearPeon

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

P
Peter Mortensen

Git 人员可以使用一个很好的帮助脚本来帮助生成基于 Git 描述的有用版本号。我展示了脚本并在我对 How would you include the current commit id in a Git project's files? 的回答中对其进行了解释。


P
Pankaj Tanwar

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

第一种方法

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 

计算贡献的代码总行数 &提出的拉取请求总数,检查 this blog


m
makuchaku

git rev-parse --short HEAD


产生一个散列,而请求一个数字。
J
Jesse Glick

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


F
FedericoCapaldo

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

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

它由两部分组成:

打印按作者分组的总日志数 (git shortlog -s -n) 示例输出 1445 John C 1398 Tom D 1376 Chrsitopher P 166 Justin T 166 你总结了每个作者的总提交数,即每行的第一个参数,并将结果打印出来 (awk '{ sum += $1; } END { print sum; }' "$@") 使用与上面相同的示例,它将求和 1445 + 1398 + 1376 + 166 + 166。因此输出将是:4,551


A
Aaron Digulla

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


如果两个分布式开发人员这样做,他们的内部版本号不会定期发生冲突/相交吗?如果他们都在共享存储库的相同转速之间进行构建,或者只有在其中任何一个更改未提交到共享存储库时才会发生冲突。没有把握。
当然可以,但冲突会告诉您该怎么做:只需与其他人交谈或始终使用更高的数字。请记住:数字无法神奇地治愈损坏的构建过程。这只是一个提醒或提示,您需要检查一些东西。
啊,是的,神奇的 buildno.txt 文件与其他文件一起提交。适合小型团队或避免并行构建的大型团队的好方法。我能想到的唯一可能无法正常工作的地方是对于使用不需要构建过程(分配一个人进行构建)的脚本语言(python)的大型团队。
P
Peter Mortensen

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

R
Robert Massaioli

我以前用的是:

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

简单但有效。


它需要一个以“commit”开头的提交消息行来打破计数。例如:“纠正了我上次不小心推入的错误和损坏的测试\ncommit”
如果你有像@PawełPolewicz 这样的提交消息,这不是 100% 的防弹,但在我看来它是最好的。
佚名

你可以试试

git log --oneline | wc -l

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

git shortlog -s

V
VonC

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

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

但是,在 Git 2.29(2020 年第四季度)中,“git shortlog(man) 变得更加精确。
它被教导通过尾行,例如“Reviewed-by:”、“Coauthored-by:”等。

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

短日志:允许指定多个组 签字人:Jeff King

既然短日志支持从预告片中读取,那么组合来自多个预告片或预告片和作者之间的计数会很有用。这可以通过对多次运行的输出进行后处理来手动完成,但确保每个名称/提交对只计算一次并非易事。这个补丁教 shortlog 在命令行上接受多个 --group 选项,并从所有选项中提取数据。这样就可以运行: git shortlog -ns --group=author --group=trailer:co-authored-by 来获得一个对作者和共同作者进行同等计数的简短日志。实施大多很简单。 “组”枚举变成了一个位域,而尾部键变成了一个列表。我没有费心实现从标准输入读取的多组语义。这是可能的,但现有的匹配代码让它变得很尴尬,我怀疑有人在乎。我们用于预告片的重复抑制现在也涵盖了作者和提交者(尽管在非预告片单组模式下,我们可以跳过哈希插入和查找,因为每次提交只看到一个值)。有一个微妙之处:我们现在关心没有设置组位的情况(在这种情况下,我们默认显示作者)。 builtin/log.c 中的调用者需要适应明确地询问作者,而不是依赖于 shortlog_init()。通过一些体操可以使其保持原样工作,但对于单个呼叫者来说不值得。

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

--group= 基于 的组提交。如果未指定 --group 选项,则默认为作者。 是以下之一:作者,提交按作者提交者分组,提交按提交者分组(与 -c 相同) 这是 --group=committer 的别名。

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

如果多次指定 --group ,则提交计入每个值下(但同样,该提交中的每个唯一值仅计算一次)。例如, git shortlog --group=author --group=trailer:co-authored-by 同时计算作者和共同作者。


R
Robert Pounder

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

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

git count


佚名

制作一个 alias 怎么样?

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

A
Ahmad Awais

像这样使用 git shortlog

git shortlog -sn

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

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