programing

Git 분기의 커밋 수 카운트

yellowcard 2023. 6. 29. 19:56
반응형

Git 분기의 커밋 수 카운트

나는 이미 이 답을 찾았습니다.분기 git에 대한 커밋 수입니다. 그러나 분기가 마스터에서 생성된 것으로 가정합니다.

가정에 의존하지 않고 분기를 따라 커밋 수를 계산하려면 어떻게 해야 합니까?

SVN에서 이것은 사소한 것이지만, 어떤 이유에서인지 그것을 이해하는 것은 정말 어렵습니다.

사용자가 속한 분기에 대한 커밋 수를 계산하는 방법

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

만약 당신의 브랜치가 Branch라고 불리는 브랜치에서 나온다면,develop:

git checkout develop
git checkout -b test
<We do 3 commits>
git rev-list --count HEAD ^develop

결과: 3

병합 무시

빠른 전달 없이 다른 분기를 현재 분기로 병합하고 위의 작업을 수행하면 병합도 계산됩니다.이는 병합을 잊어버리는 것이 커밋이기 때문입니다.

커밋들을 싶지 , 추가하세요.--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

이렇게 하면 마스터를 기반으로 하는 현재 분기의 커밋 수가 정확하게 표시됩니다.

은 피터의대담명령은긴답에▁in,은▁the령▁command터의명▁peter,git rev-list --count HEAD ^develop현재 프로젝트에서 678개 대 97개의 커밋을 더 많이 포함합니다.

제 커밋 기록은 이 분기에서 선형이므로 YMMV이지만, "지금까지 이 기능 분기에서 몇 개의 커밋을 추가했습니까?"라는 정확한 답변을 얻을 수 있습니다.

병합된 분기의 커밋 수를 계산하지 않고 기록이 시작된 이후 현재 분기에 수행된 커밋 수:

git rev-list HEAD --count --first-parent

설명서 git rev-list --help:

--first-parent

병합 커밋을 볼 때 첫 번째 부모 커밋만 따릅니다.주제 분기로 병합하는 것은 때때로 업데이트된 업스트림에만 조정하는 경향이 있기 때문에 이 옵션을 사용하면 특정 주제 분기의 진화를 볼 때 더 나은 개요를 제공할 수 있으며, 이 옵션을 사용하면 이러한 병합으로 인해 기록에 가져온 개별 커밋을 무시할 수 있습니다.--bisect와 결합할 수 없습니다.

참고: 얕은 복제본은 기록 크기를 축소합니다.예: 로 복제하는 경우--depth 11을 반환합니다.

다른 커밋 이후 수행된 커밋 수:

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

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 log --pretty=oneline | wc -l

현재 지점의 관점에서 모든 커밋이 계산됩니다.

하는것을 좋아합니다git shortlog -s -n --all"리더보드" 스타일의 이름 및 커밋 수 목록을 제공합니다.

분기를 특정 분기에서 제외한 경우(즉, 그렇지 않은 경우) 선택한 답변이 작동하지 않습니다.master또는develop).

여기서 저는 제가 사용하고 있는 또 다른 방법을 제안합니다.pre-push깃 훅

# 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

더 많은 분석을 원하시면블로그를 방문해주세요.

UNIX 시스템을 사용하는 경우 다음 작업을 수행할 수 있습니다.

git log|grep "Author"|wc -l

한 가지 방법은 분기에 대한 로그를 나열하고 줄 수를 세는 것입니다.

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

OP가 분기 비트에 대한 커밋 수를 참조할 때, 적어도 git 버전 2.17.1 이후로 주어진 답변이 다른 분기와도 작동한다는 것을 추가하고 싶습니다(피터 반데르 도스의 답변보다 더 안정적으로 보입니다).

올바르게 작동:

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

두 경우 모두 (간접적으로) 분기가 하강하는 개발 분기 및 마스터의 모든 커밋 수를 가져옵니다.

awk on gitbash/unix를 사용하는 이 명령을 사용하여 커밋 수를 가져올 수 있습니다.

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

당신은 또한 dogit log | grep commit | wc -l도 할 수 있습니다.

그리고 결과를 돌려받습니다.

언급URL : https://stackoverflow.com/questions/11657295/count-the-number-of-commits-on-a-git-branch

반응형