【问题标题】:Count the number of commits on a Git branch计算 Git 分支上的提交次数
【发布时间】:2012-07-24 07:56:52
【问题描述】:

我已经找到了这个答案:Number of commits on branch in git 但这假设分支是从 master 创建的。

如何在不依赖该假设的情况下计算分支的提交次数?

在 SVN 中这是微不足道的,但由于某种原因,在 git 中确实很难弄清楚。

【问题讨论】:

标签: git


【解决方案1】:

git log --pretty=oneline | wc -l怎么样

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

【讨论】:

  • 你算哪一栏?是第一个吗?
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    要计算您所在分支的提交:

    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
    

    【讨论】:

    • 这些都没有显示正确的数字,例如 master 和 branchname 显示相同数量的提交。
    • 评论不允许使用代码,但这应该表明它确实有效。 ==== $ git init ==== $ touch test.txt ==== $ git add . ==== $ git commit -a ==== $ git rev-list --count HEAD => 1 ==== $ git rev-list --count master => 1 ==== $ git checkout -b测试 ==== $ git rev-list --count test => 1 ==== $ git rev-list --count HEAD ^master => 0 ==== $ touch test2.txt ==== $ git添加 。 ==== $ git commit -a ==== $ git rev-list --count master => 1 ==== $ git rev-list --count test => 2 ==== $ git rev-list --count HEAD ^master => 1 ====
    • 我同意@botbot。这些都不是很准确。例如,尝试添加一些合并提交或 pull/rebase 并注意上面描述的计数开始变得不可靠。
    • @wilmoore 你的意思是在合并一个分支后你会得到一个额外的计数?这在技术上是一个提交,所以它被计算在内。但如果您不想计算这些提交,请添加 --no-merges。我会更新答案。
    • rev-list --count 标志在 git 1.7 中不存在。现在,下面使用git log 的被否决的建议比任何其他建议都更有效。
    【解决方案4】:

    要查看提交的总数,您可以按照 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
    

    【讨论】:

    • 姓名前的这些数字是什么?你能解释一下吗?
    • @Ciastopiekarz 这些是每个人提交的数量。
    【解决方案5】:

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

    git rev-list --count develop..HEAD
    

    这为我提供了基于 master 的当前分支中提交的准确计数。

    Peter 的回答中的命令 git rev-list --count HEAD ^develop 包含更多提交,在我当前的项目中是 678 对 97。

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

    【讨论】:

    • 应该是一样的。 docs says soA special notation "&lt;commit1&gt;..&lt;commit2&gt;" can be used as a short-hand for "^'&lt;commit1&gt;' &lt;commit2&gt;". 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。
    【解决方案6】:

    你也可以 混帐日志 | grep 提交 | wc -l

    然后返回结果

    【讨论】:

    • 这不可靠。例如,它将匹配提交消息中包含“commit”两次的提交。
    • @rdb 不会。它只会输出包含单词“commit”的行数,因此一行永远不会被计算两次。
    • @iBug:你没有抓住重点。如果提交消息包含单词“commit”,它将出现在与git log 输出中的“commit a1b2c...”行不同的行上,因此该提交将在结果中计算两次。更糟糕的是,如果提交消息在两个单独的行中包含两次“提交”一词。
    【解决方案7】:

    我喜欢git shortlog -s -n --all。为您提供名称和提交次数的“排行榜”样式列表。

    【讨论】:

      【解决方案8】:

      好吧,如果您将分支从非特定分支(即不是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
      

      更多分析请访问my blog

      【讨论】:

      • 在本地机器上完美运行,但在 CI 上不行,例如 jenkins 将以深度 1 进行克隆,然后您的 commitCountOfCurrentBranch 始终为 [0,1]
      【解决方案9】:

      自历史开始以来对当前分支完成了多少提交,不包括来自合并分支的提交:

      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
      

      计数 自 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
      脚本本身包含帮助。

      【讨论】:

      • git rev-list abc0923f.. --count --first-parent 为我的分支提供了正确的结果,但第一个命令给出了很大的价值
      【解决方案10】:

      作为 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
      【解决方案11】:

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

      git log|grep "Author"|wc -l
      

      【讨论】:

        【解决方案12】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-12
          • 2016-01-17
          • 1970-01-01
          • 2012-08-31
          • 2012-11-14
          • 2017-06-19
          相关资源
          最近更新 更多