나는이 대답을 이미 발견했다 : git의 브랜치 커밋 수는 브랜치가 마스터에서 생성되었다고 가정합니다.
그 가정에 의존 하지 않고 지점 을 따라 커밋 수를 어떻게 계산할 수 있습니까?
SVN에서 이것은 사소한 것이지만 어떤 이유로 git에서 알아내는 것이 실제로 어렵습니다.
나는이 대답을 이미 발견했다 : git의 브랜치 커밋 수는 브랜치가 마스터에서 생성되었다고 가정합니다.
그 가정에 의존 하지 않고 지점 을 따라 커밋 수를 어떻게 계산할 수 있습니까?
SVN에서 이것은 사소한 것이지만 어떤 이유로 git에서 알아내는 것이 실제로 어렵습니다.
답변:
현재 지점에 대한 커밋을 계산하려면
git rev-list --count HEAD
지점을 위해
git rev-list --count <branch-name>
브랜치를 만든 이후에 만들어진 브랜치에서 커밋을 계산하려면
git rev-list --count HEAD ^<branch-name>
이것은 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는 실제로 업스트림 / 마스터 ~ 400을 병합하는 것보다 큰 변화가 없을 때 1800과 같습니다. 사용하여 --no-merges
더 나은, 900처럼 제공되지 그리고 난 ~ 800이 같은 병합을 수행하고 레브 - 목록 수 1800 인 경우, 다음 나는 회전에서 낮은 수를 6과 28 사이에 도착 ~ 790와 병합을 -명부.
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 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
.
스크립트 자체에 대한 도움말이 포함되어 있습니다.
글쎄, 당신이 특정 지점에서 분기를 포크 한 경우 선택한 대답이 작동하지 않습니다 (예 : master
또는 아닙니다 develop
).
여기에 pre-push
git hooks 에서 사용하는 또 다른 방법을 제공합니다 .
# 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
마지막 명령은 방금 분기를 만든 이후 예상대로 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 | 화장실 -l
그리고 결과를 다시 얻을
git log
출력 의 "commit a1b2c ..."행과 별도의 줄에 나타나 므로 커밋이 결과에서 두 번 계산됩니다. 커밋 메시지에 두 개의 개별 줄에 "commit"이라는 단어가 두 번 포함되어 있으면 더 나쁩니다.