【发布时间】:2012-07-24 07:56:52
【问题描述】:
我已经找到了这个答案:Number of commits on branch in git 但这假设分支是从 master 创建的。
如何在不依赖该假设的情况下计算分支的提交次数?
在 SVN 中这是微不足道的,但由于某种原因,在 git 中确实很难弄清楚。
【问题讨论】:
标签: git
我已经找到了这个答案:Number of commits on branch in git 但这假设分支是从 master 创建的。
如何在不依赖该假设的情况下计算分支的提交次数?
在 SVN 中这是微不足道的,但由于某种原因,在 git 中确实很难弄清楚。
【问题讨论】:
标签: git
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 来说,一次合并就是一次提交。
如果您不想计算这些提交,请添加 --no-merges:
git rev-list --no-merges --count HEAD ^develop
【讨论】:
git log 的被否决的建议比任何其他建议都更有效。
要查看提交的总数,您可以按照 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 的当前分支中提交的准确计数。
Peter 的回答中的命令 git rev-list --count HEAD ^develop 包含更多提交,在我当前的项目中是 678 对 97。
我的提交历史在这个分支上是线性的,所以 YMMV,但它给出了我想要的确切答案,即“到目前为止,我在这个特性分支上添加了多少次提交?”。
【讨论】:
A special notation "<commit1>..<commit2>" can be used as a short-hand for "^'<commit1>' <commit2>". For example, either of the following may be used interchangeably: $ git rev-list origin..HEAD $ git rev-list HEAD ^origin
git fetch upstream; BEHIND=$(git rev-list --count HEAD..upstream/master); git merge --ff-only upstream/master~$BEHIND; 没有排队。 BEHIND 就像 1800,而实际上没有什么比合并上游/master~400 产生变化更大。使用--no-merges 也好不到哪里去,给出的结果是 900。如果我用 ~800 进行这样的合并,并且 rev-list 计数为 1800,那么我与 ~790 进行合并,我得到 6 到 28 之间计入 rev-list。
你也可以 混帐日志 | grep 提交 | wc -l
然后返回结果
【讨论】:
git log 输出中的“commit a1b2c...”行不同的行上,因此该提交将在结果中计算两次。更糟糕的是,如果提交消息在两个单独的行中包含两次“提交”一词。
我喜欢git shortlog -s -n --all。为您提供名称和提交次数的“排行榜”样式列表。
【讨论】:
好吧,如果您将分支从非特定分支(即不是master 或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
更多分析请访问my blog
【讨论】:
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 reference:
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。
脚本本身包含帮助。
【讨论】:
作为 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
在这两种情况下,我都会得到开发分支和主分支中所有提交的数量(间接)。
【讨论】:
master..current-development-branch
如果你使用的是 UNIX 系统,你可以这样做
git log|grep "Author"|wc -l
【讨论】:
你可以使用这个在 git bash/unix 上使用 awk 的命令来获取提交的数量。
git shortlog -s -n | awk '/Author/ { print $1 }'
【讨论】: