Contar o número de confirmações em uma ramificação Git

184

Eu já encontrei esta resposta: Número de confirmações no branch no git, mas isso pressupõe que o branch foi criado a partir do master.

Como posso contar o número de confirmações ao longo de uma ramificação sem confiar nessa suposição?

No SVN, isso é trivial, mas por algum motivo é realmente difícil de descobrir no git.

aaronbauman
fonte
1
possível duplicata do número de commits no ramo em git
endrigoantonini

Respostas:

350

Para contar as confirmações da filial em que você está:

git rev-list --count HEAD

para uma filial

git rev-list --count <branch-name>

Se você deseja contar as confirmações em uma ramificação feita desde que você criou a ramificação

git rev-list --count HEAD ^<branch-name>

Isso conta todos os commits já feitos que não estão no nome do branch também.

Exemplos

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

Resultado: 3

Se o seu ramo vier de um ramo chamado develop:

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

Resultado: 3

Ignorando Mesclagens

Se você mesclar outra ramificação na ramificação atual sem avanço rápido e fizer o acima, a mesclagem também será contada. Isso ocorre porque, para o git, uma mesclagem é um commit.

Se você não deseja contar essas confirmações, adicione --no-merges:

git rev-list --no-merges --count HEAD ^develop
Peter van der Does
fonte
7
nenhuma delas mostra o número correto, por exemplo, mestre e nome da filial mostram o mesmo número de confirmações.
botbot
Os comentários não permitem realmente o código, mas isso deve mostrar que funciona. ==== $ 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 test ==== $ git rev-list --count test => 1 ==== $ git rev-list --count HEAD ^ master => 0 ==== $ touch test2.txt ==== $ git adicionar . ==== $ git commit -a ==== $ git rev-list --count master => 1 ==== $ git rev-list --count test => 2 ==== $ git rev-list --count HEAD ^ master => 1 ====
Peter van der Será
1
Eu concordo com @botbot. Estes não são realmente precisos. Por exemplo, tente adicionar alguns commit de mesclagem ou pull / rebase e observe que as contagens mostradas acima começam a se tornar não confiáveis.
Wil Moore III
2
@wilmoore Você quer dizer que você recebe uma contagem extra depois de mesclar uma filial? Tecnicamente, isso é um commit e, portanto, é contado. mas se você não quiser contar esses commits, adicione --no-merges. Vou atualizar a resposta.
Peter van der Será
2
O sinalizador rev-list --count não existe no git 1.7. No momento, as sugestões abaixo ao voto abaixo git logestão funcionando melhor do que qualquer outra sugestão.
precisa saber é o seguinte
60

Para ver o total de confirmações, você pode fazer o que Peter sugeriu acima

git rev-list --count HEAD

E se você quiser ver o número de confirmações feitas por cada pessoa, tente esta linha

git shortlog -s -n

irá gerar uma saída como esta

135  Tom Preston-Werner
15  Jack Danger Canty
10  Chris Van Pelt
7  Mark Reid
6  remi
Asnad Atta
fonte
3
quais são esses números antes dos nomes? você pode explicar ?
ciasto Piekarz
5
@Ciastopiekarz, este é o número de confirmações por cada pessoa.
Asnad Atta
39

Pode exigir uma versão relativamente recente do Git, mas isso funciona bem para mim:

git rev-list --count develop..HEAD

Isso me fornece uma contagem exata de confirmações no ramo atual com base no mestre.

O comando na resposta de Pedro git rev-list --count HEAD ^developinclui muito mais confirmações, 678 vs 97 no meu projeto atual.

Meu histórico de consolidação é linear neste ramo, portanto, YMMV, mas ele me fornece a resposta exata que eu queria, que é "Quantas confirmações eu adicionei até agora neste ramo de recursos?".

scanny
fonte
Deve ser o mesmo. Os documentos dizem isso . 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
dosentmatter
Estou confuso: git fetch upstream; BEHIND=$(git rev-list --count HEAD..upstream/master); git merge --ff-only upstream/master~$BEHIND;não está fazendo fila. POR TRÁS é como 1800 quando, na realidade, nada maior que mesclar upstream / master ~ 400 produz mudanças. usar --no-mergesnão é muito melhor, dá como 900. E se eu fizer uma mesclagem como essa com ~ 800, e a contagem da lista de rev é 1800, então eu faço uma mesclagem com ~ 790, eu tenho entre 6 e 28 contagens mais baixas em rev -Lista.
dlamblin 6/02
7

Quantas confirmações foram feitas na ramificação atual desde o início do histórico, sem contar as confirmações de ramificações mescladas:

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

Na documentação git rev-list --help :

--first-parent

Siga apenas o primeiro commit pai ao ver um commit de mesclagem. Essa opção pode fornecer uma visão geral melhor ao visualizar a evolução de um ramo de tópico específico, porque a mesclagem em um ramo de tópico tende a ser apenas sobre o ajuste às atualizações upstream de tempos em tempos, e essa opção permite ignorar as confirmações individuais trazidas para sua história por essa fusão. Não pode ser combinado com --bisect.

Nota: O clone raso reduzirá o tamanho do histórico. Por exemplo, se você clonar com --depth 1, retornará 1.

número de confirmações feitas desde que alguma outra confirmação:

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

ou o mesmo:

git rev-list abc0923f.. --count --first-parent

ou use qualquer outra referência git :

git rev-list master tag-v20 --count --first-parent

Contagem confirmada desde o ano de 2018

git rev-list HEAD --count --first-parent --since=2018-01-01

01-01-2018, 01.01.2018, 01.01.2011 também funciona.


git rev-label

Eu escrevi um script para obter a revisão de versão do Git no formato '$refname-c$count-g$short$_dirty'que se expande para master-c137-gabd32ef.
A ajuda está incluída no próprio script.

kyb
fonte
rev-list git abc0923f .. --count --first-pai está dando resultados adequados para o meu ramo, mas primeiro comando está dando um grande valor
Jiss Raphel
5

E se git log --pretty=oneline | wc -l

Isso deve contar com todos os commits da perspectiva do seu ramo atual.

Remear
fonte
Qual coluna você conta? É o primeiro?
Hengjie
3

Eu gosto de fazer git shortlog -s -n --all. Fornece uma lista de nomes e número de confirmações no estilo "cabeçalho".

inorganik
fonte
2

Uma maneira de fazer isso é listar o log da sua filial e contar as linhas.

git log <branch_name> --oneline | wc -l
kjw0188
fonte
1

Bem, a resposta selecionada não funciona se você bifurcada sua filial fora do ramo inespecífica (ou seja, não masterou develop).

Aqui, ofereço uma outra maneira que estou usando nos meus pre-pushganchos 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

Para mais análises, visite o meu blog

Paul Lan
fonte
1

Como o OP faz referência ao número de confirmações no branch no git , quero acrescentar que as respostas fornecidas também funcionam com qualquer outro branch, pelo menos desde a versão 2.17.1 do git (e aparentemente mais confiável do que a resposta de Peter van der Does):

funcionando corretamente:

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

O último comando fornece zero confirmações conforme o esperado, desde que eu criei a ramificação. O comando anterior me fornece o número real de confirmações no meu ramo de desenvolvimento menos as confirmações de mesclagem

não está funcionando corretamente:

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

Nos dois casos, obtenho o número de todas as confirmações no ramo de desenvolvimento e o mestre do qual os ramos (indiretamente) descendem.

sdoe
fonte
1

Se você estiver usando um sistema UNIX, poderá fazer

git log|grep "Author"|wc -l
cerca de
fonte
-2

Você também pode fazer o git log | confirmação grep | wc -l

e obter o resultado de volta

James
fonte
1
Isso não é confiável. Ele corresponderia às confirmações que têm "confirmação" na mensagem de confirmação duas vezes, por exemplo.
Rdb
@rdb Não, não vai. Ele produzirá apenas o número de linhas que contêm a palavra "commit", portanto, uma linha nunca será contada duas vezes.
IBug
@ iBug: Você está perdendo o objetivo. Se a mensagem de confirmação contiver a palavra "confirmação", ela aparecerá em uma linha separada da linha "confirmação a1b2c ..." na git logsaída, para que a confirmação seja contada duas vezes no resultado. Pior ainda, se a mensagem de confirmação contiver a palavra "confirmação" duas vezes em duas linhas separadas.
Rdb 6/03