统计Git分支上的提交数量
我已经find了这个答案: git中的分支提交数量,但假设分支是从主创build的。
我怎么能不依靠这个假设来计算一个分支上的提交数量?
在SVN这是微不足道的,但由于某种原因真的很难弄清楚在混帐。
要计算您所在分支的提交:
git rev-list --count HEAD
为一个分支
git rev-list --count <branch-name>
如果您想要计算自从创build分支以来进行的提交
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 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
这给了我在当前分支具有基于主的确切计数提交。
在彼得的答案中的命令, git rev-list --count HEAD ^develop
包含了更多的提交,在我目前的项目上是678 vs 97。
我的提交历史在这个分支上是线性的,所以YMMV,但是它给了我想要的确切答案,即“我已经在这个特性分支上添加了多less提交?”。
git log --pretty=oneline | wc -l
git log --pretty=oneline | wc -l
应该从当前分支的angular度计算所有提交。
一种方法是列出分支的日志并计算行数。
git log <branch_name> --oneline | wc -l
我喜欢做git shortlog -s -n --all
。 为您提供“排行榜”风格的名单和提交数量列表。
你也可以做git log | grep commit | wc -l
并将结果返回
那么,如果你将分支从非特定的分支中分出来(即不是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
有关更多分析,请访问我的博客