我想获得我的Git存储库的提交数量,有点像SVN修订号。
目标是将其用作唯一的、递增的构建号。
我目前在Unix/Cygwin/msysGit上这样做:
git log --pretty=format:'' | wc -l
但我觉得这有点像黑客。
有更好的方法吗?如果我真的不需要wc甚至Git,那就太酷了,所以它可以在裸Windows上工作。只需读取文件或目录结构…
wc
你不是第一个想到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是一种方式。
git shortlog
获取修订版的提交计数(HEAD、master、提交哈希):
HEAD
master
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的收缩形式。
-s
--summary
如果你只使用一个分支,比如master,我认为这会很棒:
git rev-list --full-history --all | wc -l
这只会输出一个数字。您可以将其别名为
git revno
使事情变得非常方便。为此,编辑您的.git/config文件并将其添加到:
.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)可访问的提交。
git rev-list <commit>
--count:打印一个数字,说明将列出多少次提交,并抑制所有其他输出。
--count
一个简单的方法是:
git log --oneline | wc -l
oneline确保了这一点。
oneline
在我们公司,我们从SVN迁移到Git。缺乏修订号是一个大问题!
执行git svn clone,然后用其SVN修订号标记最后一次SVN提交:
git svn clone
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修订的一个分支时才有用。
1234.0
1234.13
可以将--first-parent添加到微号以抑制仅由合并其他分支引起的一些提交,尽管这可能是不必要的。
--first-parent
像这样使用git短日志
git shortlog -sn
或创建别名(用于基于ZSH的终端)
#按提交显示贡献者别名gcall="git短日志-sn"
你可以试试
或列出存储库中贡献人员所做的所有提交
git config --global alias.count 'rev-list --all --count'
如果您将其添加到您的配置中,您可以引用该命令;
git count
你只能使用:
结果:
827 user one15 user two2 Gest
做一个alias怎么样?
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 shortlog”(man)变得更加精确。它已被教导根据拖车行的内容进行组提交,如“Reviewed-by:”,“Coauthored-by:”等。
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
签名人:Jeff King
现在shortlog支持从预告片中读取,组合来自多个预告片或预告片和作者之间的计数可能很有用。这可以通过后处理多次运行的输出手动完成,但确保每个名称/提交对只计数一次是非常重要的。这个补丁教短日志在命令行上接受多个--group选项,并从所有这些选项中提取数据。这使得可以运行:git shortlog -ns --group=author --group=trailer:co-authored-by获得一个同样计算作者和共同作者的短日志。实现非常简单。“group”枚举变成一个位字段,预告片键变成一个列表。我没有费心实现从标准输入读取的多组语义学。这是可能的,但是现有的匹配代码使它变得尴尬,我怀疑是否有人关心。我们用于预告片的重复抑制现在也涵盖了作者和提交者(尽管在非预告片单组模式下,我们可以跳过哈希插入和查找,因为我们每次提交只能看到一个值)。有一个微妙之处:我们现在关心没有设置组位的情况(在这种情况下,我们默认显示作者)。builtin/log.c中的调用者需要适应以明确询问作者,而不是依赖shortlog_init()。使用一些体操可以使其保持原样工作,但对于单个调用者来说不值得。
现在shortlog支持从预告片中读取,组合来自多个预告片或预告片和作者之间的计数可能很有用。这可以通过后处理多次运行的输出手动完成,但确保每个名称/提交对只计数一次是非常重要的。
这个补丁教短日志在命令行上接受多个--group选项,并从所有这些选项中提取数据。
--group
这使得可以运行:
git shortlog -ns --group=author --group=trailer:co-authored-by
获得一个同样计算作者和共同作者的短日志。
实现非常简单。“group”枚举变成一个位字段,预告片键变成一个列表。我没有费心实现从标准输入读取的多组语义学。这是可能的,但是现有的匹配代码使它变得尴尬,我怀疑是否有人关心。
group
我们用于预告片的重复抑制现在也涵盖了作者和提交者(尽管在非预告片单组模式下,我们可以跳过哈希插入和查找,因为我们每次提交只能看到一个值)。
有一个微妙之处:我们现在关心没有设置组位的情况(在这种情况下,我们默认显示作者)。builtin/log.c中的调用者需要适应以明确询问作者,而不是依赖shortlog_init()。使用一些体操可以使其保持原样工作,但对于单个调用者来说不值得。
builtin/log.c
shortlog_init()
git shortlog现在包含在其手册页中:
--group=<type>基于<type>的组提交。如果没有--group选项指定,默认值为author。<type>是以下之一:author,提交按作者分组committer,提交按提交者分组(与-c相同)这是--group=committer的别名。
--group=<type>
基于<type>的组提交。如果没有--group选项指定,默认值为author。<type>是以下之一:
<type>
author
committer
-c
这是--group=committer的别名。
--group=committer
git shortlog现在也包含在其手册页中:
如果多次指定--group,则每次提交都会计数值(但同样,该提交中每个唯一值仅一次)。对于例如,git shortlog --group=author --group=trailer:co-authored-by包括作者和合著者。
git shortlog --group=author --group=trailer:co-authored-by
以下命令打印当前分支上的提交总数。
git shortlog -s -n | awk '{ sum += $1; } END { print sum; }' "$@"
它由两部分组成:
打印按作者分组的日志总数(git shortlog -s -n)
示例输出
1445 John C1398 Tom D1376 Chrsitopher P166 Justin T166 You
求和每个作者的总提交次数,即每行的第一个参数,并打印结果(awk '{ sum += $1; } END { print sum; }' "$@")
awk '{ sum += $1; } END { print sum; }' "$@"
使用与上面相同的示例,它将求和1445 + 1398 + 1376 + 166 + 166。因此输出将是:
1445 + 1398 + 1376 + 166 + 166
4,551
有几种很酷的方法可以做到这一点-
此命令打印为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
要计算贡献的代码总行和引发的总拉取请求,请选中这个博客