我想获取我的 Git 存储库的提交次数,有点像 SVN 修订号。
目标是将其用作唯一的、递增的内部版本号。
我目前在 Unix/Cygwin/msysGit 上这样做:
git log --pretty=format:'' | wc -l
但我觉得这有点骇人听闻。
有没有更好的方法来做到这一点?如果我实际上不需要 wc
甚至 Git,那就太酷了,这样它就可以在裸 Windows 上运行。只需读取文件或目录结构...
git rev-list HEAD --count
git rev-list
要获取修订的提交计数(HEAD
、master
、提交哈希):
git rev-list --count <revision>
要获取所有分支的提交计数:
git rev-list --all --count
我建议不要将其用于构建标识符,但如果必须,最好将计数用于您正在构建的分支。这样,相同的修订版将始终具有相同的编号。如果您对所有分支使用计数,其他分支上的活动可能会更改数量。
git shortlog
是一种方式。
git rev-list HEAD --count
而不是 OP 中给出的原始方法。在我的测试中,git log --pretty=format:'' | wc -l
相差 1。
git log --oneline | wc -l
没有关闭一个(OS X 10.8.5)。
此命令返回按提交者分组的提交计数:
git shortlog -s
输出:
14 John lennon
9 Janis Joplin
您可能想知道 -s
参数是 --summary
的缩写形式。
git shortlog
本身并不能解决 total 提交数(未按作者分组)的原始问题。请改用 git rev-list HEAD --count
。
| sort -n
对其进行排序
git shortlog -sn
git rev-list HEAD --count
git rev-list <commit>
:列出可通过跟随给定提交的父链接访问的提交(在本例中为 HEAD)。
--count
:打印一个数字,说明将列出多少次提交,并禁止所有其他输出。
如果您正在为提交寻找一个唯一且仍然非常易读的标识符,那么 git describe 可能正是您的理想之选。
fatal: No names found, cannot describe anything
,则需要创建至少一个标签(计数将从该标签开始)。如果标签没有注释,你应该做 git describe --tags
你可以使用:
git shortlog -s -n
结果 :
827 user one
15 user two
2 Gest
您不是第一个想到 "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。
git describe
是不可能的。
要将其放入变量中,最简单的方法是:
export GIT_REV_COUNT=`git rev-list --all --count`
git rev-list
是正确使用的工具,而不是像其他人所说的 git log
。
wc -l
,只需使用 --count
开关:git rev-list --all --count
。
--count
开关本身更老。
一个简单的方法是:
git log --oneline | wc -l
oneline
确保了这一点。
Git shortlog 是获取提交详细信息的一种方法:
git shortlog -s -n
这将给出提交次数,后跟作者姓名。 -s 选项删除作者所做的每个提交的所有提交消息。如果您还想查看提交消息,请删除相同的选项。 -n 选项用于对整个列表进行排序。希望这可以帮助。
git shortlog
本身并不能解决 total 提交数(未按作者分组)的原始问题。请改用 git rev-list HEAD --count
。
如果您只使用一个分支,例如 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 描述的有用版本号。我展示了脚本并在我对 How would you include the current commit id in a Git project's files? 的回答中对其进行了解释。
有几种很酷的方法可以做到这一点 -
第一种方法
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
git rev-parse --short HEAD
使用 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
添加到微编号以抑制仅因合并其他分支而产生的某些提交,尽管这可能是不必要的。
以下命令打印当前分支上的提交总数。
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
在构建期间生成一个数字并将其写入文件。每当您发布版本时,请使用注释“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 log | grep "^commit" | wc -l
简单但有效。
你可以试试
git log --oneline | wc -l
或列出在存储库中做出贡献的人所做的所有提交
git shortlog -s
git shortlog 本身并没有解决提交总数的原始问题(不按作者分组)
这是真的,并且 git rev-list HEAD --count 仍然是最简单的答案。
但是,在 Git 2.29(2020 年第四季度)中,“git shortlog
”(man) 变得更加精确。
它被教导通过尾行,例如“Reviewed-by:
”、“Coauthored-by:
”等。
请参阅 Jeff King (peff
) 的commit 63d24fa、commit 56d5dde、commit 87abb96、commit f17b0b9、commit 47beb37、commit f0939a0、commit 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=
git shortlog
现在还在其 man page 中包含:
如果多次指定 --group ,则提交计入每个值下(但同样,该提交中的每个唯一值仅计算一次)。例如, git shortlog --group=author --group=trailer:co-authored-by 同时计算作者和共同作者。
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"
不定期副业成功案例分享
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
更加简洁和准确。git rev-list HEAD --count
现在是一个更好的解决方案。git log --oneline | wc -l