私はすでにこの答えを見つけました: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
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
これにより、マスターをベースとする現在のブランチでのコミットの正確な数がわかります。
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に似ていますが、実際にはアップストリーム/マスター〜400をマージするだけで変更が生じます。使用すること--no-merges
はあまり良くありません、900のようになります。そして、このように〜800でマージし、rev-listカウントが1800である場合、〜790でマージすると、revのカウントが6〜28低くなります。 -リスト。
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リファレンスを使用してください:
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
。
スクリプト自体にヘルプが含まれています。
いかがですか git log --pretty=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 logを実行することもできます| grep commit | wc -l
結果を取り戻す
git log
出力の「commit a1b2c ...」行とは別の行に表示されるため、コミットは結果で2回カウントされます。コミットメッセージに2つの別々の行に「コミット」という単語が2回含まれる場合はさらに悪いことになります。