我想获取我的Git存储库的提交次数,有点像SVN版本号。
目标是将其用作唯一的,递增的内部版本号。
我目前在Unix / Cygwin / msysGit上确实喜欢这样:
git log --pretty=format:'' | wc -l
但是我觉得这有点hack。
有更好的方法吗?如果我实际上wc
甚至不需要Git,那将很酷,因此它可以在裸机上运行。只需读取文件或目录结构...
git rev-list HEAD --count
git rev-list
我想获取我的Git存储库的提交次数,有点像SVN版本号。
目标是将其用作唯一的,递增的内部版本号。
我目前在Unix / Cygwin / msysGit上确实喜欢这样:
git log --pretty=format:'' | wc -l
但是我觉得这有点hack。
有更好的方法吗?如果我实际上wc
甚至不需要Git,那将很酷,因此它可以在裸机上运行。只需读取文件或目录结构...
git rev-list HEAD --count
git rev-list
Answers:
要获取修订的提交计数(HEAD
,,master
提交哈希):
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
原始问题中给出的方法)又是不正确的:您可以通过反转match(git shortlog | grep -Ev '^[ ]+\w+'
)并看到例如不包含任何消息的提交(即“ <none>”)来进行查看。使用git rev-list HEAD --count
既简洁又准确。
git rev-list HEAD --count
即现在这是一个更好的解决方案。
git log --oneline | wc -l
git shortlog
是一种方式。
git rev-list HEAD --count
而不是OP中给出的原始方法。在我的测试中,git log --pretty=format:'' | wc -l
相差一个。
git log --oneline | wc -l
不能被一个(OS X 10.8.5)关闭。
git rev-list HEAD --count
git rev-list <commit>
:通过遵循给定提交(在本例中为HEAD)的父链接列出可访问的提交。
--count
:打印一个数字,说明将列出多少个提交,并取消所有其他输出。
如果您正在为提交寻找唯一且仍易读的标识符,则git describe可能只是您的事情。
您不是第一个想到Git中“修订号”的人,但是' wc
'非常危险,因为可以删除或压缩提交,并且可以重新查看历史记录。
“版本号”对于Subversion尤其重要,因为在合并的情况下是必需的(SVN1.5和1.6在此方面有所改进)。
您可能最终会获得一个预提交的挂钩,该挂钩将在注释中包含修订号,并且该算法不涉及查找分支的所有历史以确定正确的编号。
Bazaar实际上提出了这样的算法,对于您想做的事情可能是一个很好的起点。
(正如Bombe的答案所指出的那样,Git实际上具有自己的算法,该算法基于最新的标签,加上提交次数,再加上一点SHA-1密钥)。如果对您有用,您应该看到(并赞扬)他的答案。
为了说明Aaron的想法,您还可以将Git commit哈希附加到要随应用程序一起分发的应用程序的“ info”文件中。
这样,“关于”框将如下所示:
应用程序编号是提交的一部分,但是在打包过程中会生成“应用程序的“信息”文件”,从而将应用程序内部版本号有效地链接到技术修订版ID。
一种简单的方法是:
git log --oneline | wc -l
oneline
确保做到这一点。
要将其放入变量,最简单的方法是:
export GIT_REV_COUNT=`git rev-list --all --count`
git rev-list
是正确的工具,而不是git log
像其他人所说的那样。
wc -l
只使用--count
开关:git rev-list --all --count
。
--count
开关本身还旧。
Git shortlog是获取提交详细信息的一种方法:
git shortlog -s -n
这将给出提交次数,后跟作者姓名。-s选项删除作者所做的每个提交的所有提交消息。如果您还希望看到提交消息,请删除相同的选项。-n选项用于对整个列表进行排序。希望这可以帮助。
git shortlog
本身不能解决提交总数的原始问题(未按作者分组)。使用git rev-list HEAD --count
代替。
有个不错的帮助程序脚本,Git员工可用来帮助基于Git描述生成有用的版本号。我显示了脚本并在我的回答中作了解释,您将如何在Git项目的文件中包括当前提交ID?。
如果您只使用一个分支,例如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]
在构建过程中生成一个数字并将其写入文件。无论何时发布,请提交带有注释“ 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
很简单,但是很有效。
使用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
的类似结果。从分支的签出运行时1234.13
,如果在该分支上进行了13次提交,则会得到类似的信息。显然,这仅在您最多基于给定master
修订版本的一个分支的情况下才有用。
--first-parent
可以添加到微数字中,以抑制仅合并其他分支而产生的某些提交,尽管这可能是不必要的。
你可以试试
git log --oneline | wc -l
或列出由存储库中的人员完成的所有提交
git shortlog -s
像这样使用git shortlog
git shortlog -sn
或创建别名(用于基于ZSH的终端)
# show contributors by commits
alias gcall="git shortlog -sn"