计算Git分支上的提交次数

我已经找到了这个答案:在git的分支上提交的数量 但这假设分支是从master.

. 0创建的

基于这个假设,我如何计算沿着分支没有提交的数量?

在SVN中,这是微不足道的,但由于某种原因,在git中很难解决。

143513 次浏览

git log --pretty=oneline | wc -l

这将从当前分支的角度计算所有提交。

一种方法是列出分支的日志并计算行数。

git log <branch_name> --oneline | wc -l

计算你所在分支的提交次数:

git rev-list --count HEAD

对于分支

git rev-list --count <branch-name>

如果您想统计自创建分支以来在分支上所做的提交次数

git rev-list --count HEAD ^<branch-name>

这也将计算所有不在分支名称上的提交。

例子

git checkout master
git checkout -b test
<We do 3 commits>
git rev-list --count HEAD ^master

结果:3

如果你的分支来自一个名为develop的分支:

git checkout develop
git checkout -b test
<We do 3 commits>
git rev-list --count HEAD ^develop

结果:3

忽略合并

如果你在没有快进的情况下将另一个分支合并到当前分支中,并且执行上述操作,合并也会被计算在内。这是因为对于git来说,merge就是提交。

如果你不想计算这些提交,添加--no-merges:

git rev-list --no-merges --count HEAD ^develop

要查看提交的总数,您可以按照Peter上面建议的方法执行

git rev-list --count HEAD

如果你想知道每个人提交的数量,试试这一行

git shortlog -s -n

会产生这样的输出吗

135  Tom Preston-Werner
15  Jack Danger Canty
10  Chris Van Pelt
7  Mark Reid
6  remi

它可能需要一个相对较新的Git版本,但这对我来说很好:

git rev-list --count develop..HEAD

这为我提供了当前分支中以master为基础的提交的确切计数。

在彼得的回答命令,git rev-list --count HEAD ^develop包括更多的提交,678 vs 97在我目前的项目。

在这个分支上,我的提交历史是线性的,所以是YMMV,但它给了我想要的确切答案,即“到目前为止,我在这个特性分支上添加了多少次提交?”

你也可以 Git log | grep commit | wc -l

然后得到结果

我喜欢做git shortlog -s -n --all。为您提供一个“排行榜”风格的名称和提交数量列表。

好吧,如果你从非特定的分支(即不是masterdevelop)中派生出你的分支,那么所选的答案将不起作用。

这里我提供了另一种在pre-push git钩子中使用的方法。

# Run production build before push
echo "[INFO] run .git/hooks/pre-push"


echo "[INFO] Check if only one commit"


# file .git/hooks/pre-push
currentBranch=$(git symbolic-ref HEAD | sed -e 's,.*/\(.*\),\1,')


gitLog=$(git log --graph --abbrev-commit --decorate  --first-parent HEAD)


commitCountOfCurrentBranch=0
startCountCommit=""
baseBranch=""


while read -r line; do


# if git log line started with something like "* commit aaface7 (origin/BRANCH_NAME)" or "commit ae4f131 (HEAD -> BRANCH_NAME)"
# that means it's on our branch BRANCH_NAME


matchedCommitSubstring="$( [[ $line =~ \*[[:space:]]commit[[:space:]].*\((.*)\) ]] && echo ${BASH_REMATCH[1]} )"


if [[ ! -z ${matchedCommitSubstring} ]];then


if [[  $line =~ $currentBranch ]];then
startCountCommit="true"
else
startCountCommit=""


if [[ -z ${baseBranch} ]];then
baseBranch=$( [[ ${matchedCommitSubstring} =~ (.*)\, ]] && echo ${BASH_REMATCH[1]} || echo ${matchedCommitSubstring} )


fi


fi


fi




if [[ ! -z ${startCountCommit} && $line =~ ^\*[[:space:]]commit[[:space:]] ]];then
((commitCountOfCurrentBranch++))
fi




done <<< "$gitLog"


if [[ -z ${baseBranch} ]];then


baseBranch="origin/master"


else


baseBranch=$( [[ ${baseBranch} =~ ^(.*)\, ]] && echo ${BASH_REMATCH[1]} || echo ${baseBranch} )


fi




echo "[INFO] Current commit count of the branch ${currentBranch}:  ${commitCountOfCurrentBranch}"


if [[ ${commitCountOfCurrentBranch} -gt 1 ]];then
echo "[ERROR] Only a commit per branch is allowed. Try run 'git rebase -i ${baseBranch}'"
exit 1
fi

更多分析,请访问我的博客

从历史开始到当前分支的提交量,不包括来自合并分支的提交量:

git rev-list HEAD --count --first-parent

来自文档Git版本列表——帮助:

--first-parent

在看到合并提交时,只遵循第一个父提交。在查看特定主题分支的演变时,此选项可以提供更好的概述,因为合并到主题分支往往只是为了不时地调整到更新的上游,并且此选项允许您忽略通过这种合并引入历史记录的单个提交。不能与——bisect组合。

浅克隆将缩小历史大小。例如,如果你用--depth 1克隆,将返回1。

自那以后提交的数量一些其他的提交:

git rev-list HEAD abc0923f --count --first-parent

或相同:

git rev-list abc0923f.. --count --first-parent

或使用任何其他git参考:

git rev-list master tag-v20 --count --first-parent

计数自2018年以来已提交

git rev-list HEAD --count --first-parent --since=2018-01-01

01-01-2018, 01.01.2018, 2018.01.01也适用。


git rev-label

我写了一个脚本从Git中获得版本修订,格式为'$refname-c$count-g$short$_dirty',扩展为master-c137-gabd32ef
帮助包含在脚本本身中

由于OP引用git中在分支上提交的数量,我想补充的是,这里给出的答案也适用于任何其他分支,至少从git 2.17.1版本开始(似乎比Peter van der Does的答案更可靠):

正常工作:

git checkout current-development-branch
git rev-list --no-merges --count master..
62
git checkout -b testbranch_2
git rev-list --no-merges --count current-development-branch..
0

最后一个命令像预期的那样给出零提交,因为我刚刚创建了分支。前面的命令给出了开发分支上的实际提交数减去合并提交数

工作不正常:

git checkout current-development-branch
git rev-list --no-merges --count HEAD
361
git checkout -b testbranch_1
git rev-list --no-merges --count HEAD
361

在这两种情况下,我都得到了开发分支和master中所有提交的数量。

如果您使用的是UNIX系统,则可以这样做

git log|grep "Author"|wc -l

你可以在git bash/unix上使用awk命令来获取提交的数量。

    git shortlog -s -n | awk '/Author/ { print $1 }'