私はすでにこの答えを見つけました:gitのブランチでのコミットの数ですが、 それはブランチがマスターから作成されたことを前提としています。
その仮定に依存せずに、ブランチに沿ったコミットの数をカウントするにはどうすればよいですか?
SVNではこれは些細なことですが、何らかの理由でgitで理解するのは非常に困難です。
私はすでにこの答えを見つけました:gitのブランチでのコミットの数ですが、 それはブランチがマスターから作成されたことを前提としています。
その仮定に依存せずに、ブランチに沿ったコミットの数をカウントするにはどうすればよいですか?
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
これにより、マスターをベースとする現在のブランチでのコミットの正確な数がわかります。
Peterの回答のコマンドにgit rev-list --count HEAD ^develop
は、さらに多くのコミットが含まれています。現在のプロジェクトでは678対97です。
私のコミット履歴はこのブランチでは線形なのでYMMVですが、「この機能ブランチでこれまでにいくつのコミットを追加しましたか?」という正確な答えが得られます。
git rev-list HEAD --count --first-parent
ドキュメントからgitrev-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
'$refname-c$count-g$short$_dirty'
に展開されるような形式でGitからバージョン改訂を取得するスクリプトを作成しましたmaster-c137-gabd32ef
。
スクリプト自体にヘルプが含まれています。
どうですかgit log --pretty=oneline | wc -l
これにより、現在のブランチの観点からすべてのコミットがカウントされます。
私はするのが好きgit shortlog -s -n --all
です。名前とコミット数の「リーダーボード」スタイルのリストを提供します。
UNIXシステムを使用している場合は、次のことができます。
git log|grep "Author"|wc -l
これを行う1つの方法は、ブランチのログを一覧表示し、行を数えることです。
git log <branch_name> --oneline | 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
詳細な分析については、私のブログをご覧ください
OPがgitのブランチでのコミット数を参照しているので、少なくともgitバージョン2.17.1以降(そしてPeter van der Doesによる回答よりも確実に)、他のブランチでも指定された回答が機能することを追加したいと思います。
正しく機能している:
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 }'
gitlog|を実行することもできます grepコミット| wc -l
結果を取り戻します