我已经找到了这个答案:git 中分支上的提交数, 但假设分支是从 master 创建的。
如何在不依赖该假设的情况下计算分支的提交次数?
在 SVN 中这是微不足道的,但由于某种原因,在 git 中真的很难弄清楚。
我已经找到了这个答案:git 中分支上的提交数, 但假设分支是从 master 创建的。
如何在不依赖该假设的情况下计算分支的提交次数?
在 SVN 中这是微不足道的,但由于某种原因,在 git 中真的很难弄清楚。
要计算您所在分支的提交:
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 来说,合并就是一次提交。
如果您不想计算这些提交,请添加--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 对 97。
我的提交历史在这个分支上是线性的,所以 YMMV,但它给了我想要的确切答案,即“到目前为止,我在这个特性分支上添加了多少次提交?”。
git rev-list HEAD --count --first-parent
从文档git rev-list --help:
--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
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
.
脚本本身包含帮助。
怎么样git log --pretty=oneline | wc -l
从当前分支的角度来看,这应该计算所有提交。
如果您使用的是 UNIX 系统,您可以这样做
git log|grep "Author"|wc -l
我喜欢做git shortlog -s -n --all
。为您提供名称和提交次数的“排行榜”样式列表。
一种方法是列出您的分支的日志并计算行数。
git log <branch_name> --oneline | wc -l
master
好吧,如果您将分支从非特定分支(即 not or develop
)中分叉出来,则所选答案不起作用。
在这里,我提供了另一种在我的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
更多分析请访问我的博客
作为 OP 引用Number of commits on branch in git我想补充一点,那里的给定答案也适用于任何其他分支,至少从 git 版本 2.17.1 开始(并且似乎比 Peter van der 的答案更可靠):
正常工作:
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
在这两种情况下,我都得到了开发分支和主分支中所有提交的数量(间接地)。
您可以使用在 git bash/unix 上使用 awk 的命令来获取提交次数。
git shortlog -s -n | awk '/Author/ { print $1 }'
你也可以做 git log | grep 提交 | wc -l
并取回结果