我想得到我的Git存储库的提交数量,有点像SVN版本号。
目标是将其用作唯一的递增构建号。
我目前在Unix / Cygwin / msysGit上这样做:
git log --pretty=format:'' | wc -l
但我觉得这有点像黑客。
有没有更好的方法呢?如果我实际上不需要wc
甚至Git,那将是很酷的,因此它可以在裸Windows上运行。只需读取文件或目录结构......
答案 0 :(得分:1019)
获取修订的提交计数(HEAD
,master
,提交哈希):
git rev-list --count <revision>
获取所有分支的提交计数:
git rev-list --all --count
我建议不要将它用于构建标识符,但如果必须,最好使用您正在构建的分支的计数。这样,相同的修订版将始终具有相同的编号。如果您对所有分支使用计数,则其他分支上的活动可能会更改该数字。
答案 1 :(得分:140)
git shortlog
是单向的。
答案 2 :(得分:100)
git rev-list HEAD --count
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框看起来像是:
应用程序编号是提交的一部分,但是“应用程序”信息“文件”是在打包过程中生成的,有效地将 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 shortlog
” (man)变得更加精确。
它被教导可以通过预告行的内容对提交进行分组 ,例如“ Reviewed-by:
,“ Coauthored-by:
”等。
请参见commit 63d24fa,commit 56d5dde,commit 87abb96,commit f17b0b9,commit 47beb37,commit f0939a0,commit 92338c4(2020年9月27日)和commit 45d93eb的Jeff 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
它由两部分组成:
打印按作者(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
答案 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