统计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 

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