我想获取我的 Git 存储库的提交次数,有点像 SVN 修订号。
目标是将其用作唯一的、递增的内部版本号。
我目前在 Unix/Cygwin/msysGit 上这样做:
git log --pretty=format:'' | wc -l
但我觉得这有点骇人听闻。
有没有更好的方法来做到这一点?如果我实际上不需要wc
甚至不需要 Git,那就太酷了,这样它就可以在裸 Windows 上运行。只需读取文件或目录结构...
我想获取我的 Git 存储库的提交次数,有点像 SVN 修订号。
目标是将其用作唯一的、递增的内部版本号。
我目前在 Unix/Cygwin/msysGit 上这样做:
git log --pretty=format:'' | wc -l
但我觉得这有点骇人听闻。
有没有更好的方法来做到这一点?如果我实际上不需要wc
甚至不需要 Git,那就太酷了,这样它就可以在裸 Windows 上运行。只需读取文件或目录结构...
要获取修订的提交计数(HEAD
, master
,提交哈希):
git rev-list --count <revision>
要获取所有分支的提交计数:
git rev-list --all --count
我建议不要将其用于构建标识符,但如果必须,最好将计数用于您正在构建的分支。这样,相同的修订版将始终具有相同的编号。如果您对所有分支使用计数,其他分支上的活动可能会更改数量。
git shortlog
是一种方式。
此命令返回按提交者分组的提交计数:
git shortlog -s
输出:
14 John lennon
9 Janis Joplin
您可能想知道-s
参数是 的收缩形式--summary
。
git rev-list HEAD --count
git rev-list <commit>
:列出可以通过跟随给定提交的父链接(在本例中为HEAD)到达的提交。
--count
:打印一个数字,说明将列出多少次提交,并禁止所有其他输出。
如果您正在为提交寻找一个唯一且仍然非常易读的标识符,那么git describe可能正是您的理想之选。
你可以使用:
git shortlog -s -n
结果 :
827 user one
15 user two
2 Gest
您不是第一个在 Git 中考虑“修订号”的人,但 ' wc
' 非常危险,因为提交可以被擦除或压缩,并且可以重新访问历史。
“修订号”对于 Subversion 尤其重要,因为在合并的情况下需要它(SVN1.5 和 1.6 在这方面有所改进)。
您最终可能会得到一个预提交挂钩,该挂钩将在评论中包含修订号,并且算法不涉及查找分支的所有历史以确定正确的编号。
Bazaar实际上想出了这样一个算法,它可能是你想做的一个很好的起点。
(正如Bombe 的回答所指出的,Git 实际上有自己的算法,基于最新的标签,加上提交的数量,再加上一点 SHA-1 密钥)。如果它对您有用,您应该看到(并赞成)他的答案。
为了说明Aaron 的想法,您还可以将 Git 提交哈希附加到您与应用程序一起分发的应用程序的“信息”文件中。
这样,关于框将如下所示:
应用编号是提交的一部分,但在打包过程中会生成“应用程序的“信息”文件”,从而有效地将应用内部版本号链接到技术修订ID。
要将其放入变量中,最简单的方法是:
export GIT_REV_COUNT=`git rev-list --all --count`
一个简单的方法是:
git log --oneline | wc -l
oneline
确保这一点。
Git shortlog 是获取提交详细信息的一种方法:
git shortlog -s -n
这将给出提交次数,后跟作者姓名。-s 选项删除作者所做的每个提交的所有提交消息。如果您还想查看提交消息,请删除相同的选项。-n 选项用于对整个列表进行排序。希望这可以帮助。
如果您只使用一个分支,例如 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 描述的有用版本号。我展示了脚本并在我对如何在 Git 项目的文件中包含当前提交 ID 的回答中进行了解释。.
git rev-parse --short HEAD
在构建期间生成一个数字并将其写入文件。每当您发布版本时,请使用注释“Build 147”(或当前的内部版本号)提交该文件。不要在正常开发过程中提交文件。这样,您可以轻松地在 Git 中的内部版本号和版本之间进行映射。
在我们公司,我们从 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)
以下命令打印当前分支上的提交总数。
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 You
总结每个作者的总提交数,即每行的第一个参数,并将结果打印出来(awk '{ sum += $1; } END { print sum; }' "$@"
)
使用与上面相同的示例将总结1445 + 1398 + 1376 + 166 + 166
。因此输出将是:
4,551
我以前用的是:
git log | grep "^commit" | wc -l
简单但有效。
使用 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
可以添加到微编号以抑制仅由合并其他分支引起的某些提交,尽管这可能是不必要的。
git shortlog
本身并不能解决提交总数的原始问题(未按作者分组)
这是真的,并且 git rev-list HEAD --count 仍然是最简单的答案。
但是,随着 Git 2.29(2020 年第四季度),“ git shortlog
” (man)变得更加精确。
它被教导通过拖车行的内容对提交进行分组,例如“ 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
计算作者和共同作者。
有几种很酷的方法可以做到这一点 -
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
要计算贡献的代码总行数和提出的总拉取请求,请查看此博客
你可以试试
git log --oneline | wc -l
或列出在存储库中做出贡献的人所做的所有提交
git shortlog -s
git config --global alias.count 'rev-list --all --count'
如果将其添加到配置中,则只需引用命令即可;
git count
制作一个怎么样alias
?
alias gc="git rev-list --all --count" #Or whatever name you wish
像这样使用 git shortlog
git shortlog -sn
或者创建一个别名(对于基于 ZSH 的终端)
# show contributors by commits
alias gcall="git shortlog -sn"