Como obtenho a contagem de confirmação do Git?

753

Gostaria de obter o número de confirmações do meu repositório Git, um pouco como os números de revisão do SVN.

O objetivo é usá-lo como um número de compilação único e incrementador.

Atualmente, faço isso no Unix / Cygwin / msysGit:

git log --pretty=format:'' | wc -l

Mas eu sinto que é um pouco de hack.

Existe uma maneira melhor de fazer isso? Seria legal se eu realmente não precisasse wcou nem o Git, para que pudesse funcionar em um Windows vazio. Basta ler um arquivo ou uma estrutura de diretórios ...

Splo
fonte
1
Você pode encontrar respostas interessantes aqui: qual é o equivalente do git para o número de revisão?
Sebastien Varrette
190
git rev-list HEAD --count git rev-list
Jake Berger
14
@berger: Eu acho que seu comentário deve ser convertido em uma resposta.
Utapyngo 8/03/2013
@utapyngo: dadas as 13 outras respostas, eu sabia que seria enterrado. Eu postei aqui então.
Jake Berger
@berger, esta resposta não funciona para o git1.7.0.
Vorac 31/03

Respostas:

1160

Para obter uma contagem cometer uma revisão ( HEAD, master, um hash de commit):

git rev-list --count <revision>

Para obter a contagem de confirmação em todas as ramificações:

git rev-list --all --count

Eu recomendo não usar isso para identificador de compilação, mas se você precisar, provavelmente é melhor usar a contagem da ramificação na qual você está construindo. Dessa forma, a mesma revisão sempre terá o mesmo número. Se você usar a contagem para todas as ramificações, a atividade em outras ramificações poderá alterar o número.

Benjamin Atkin
fonte
27
git shortlog | grep -E '^[ ]+\w+' | wc -lse você deseja obter o número total e git shortlog | grep -E '^[^ ]'se deseja obter o número de confirmações para cada colaborador.
Skalee 24/05
2
Obrigado por apontar wc -l. Minimalismo FTW. Eu o incorporei na minha resposta.
Benjamin Atkin 25/05
17
Esta solução é hacky (semelhante à git log --pretty=format:'' | wc -labordagem dada na pergunta original) e incorreta: você pode ver isso invertendo a correspondência ( git shortlog | grep -Ev '^[ ]+\w+') e vendo que, por exemplo, confirmações sem mensagem (ou seja, "<nenhum>") não são contadas. O uso git rev-list HEAD --counté mais sucinto e preciso.
ctrueden
17
@ BenAtkin: Minhas desculpas; não era minha intenção ser ofensivo, apenas factual. Ponto tomado sobre a data da resposta. Na época, sua solução poderia muito bem ter sido a melhor disponível. Mas mantenho minha afirmação de que git rev-list HEAD --counté uma solução melhor agora.
ctrueden
3
Também foi adicionada uma resposta e funciona também com versões antigas:git log --oneline | wc -l
Jimmy Kane
155

git shortlog é uma maneira.

Rayne
fonte
5
Ty. Isso funcionou para mim ao contar commits em um intervalo; git shortlog sha1..sha2
RJFalconer
1
Sim, a primeira linha do git shortlog possui o número de confirmações. Problema resolvido.
Robert Massaioli
5
O número de confirmações é agrupado por confirmador, não tão bom. Pode contar linhas no git shortlog, mas isso não funciona sobre o ssh sem um terminal por algum motivo (pager?). A solução original do solicitante é a melhor! git log --pretty = formato: '' | wc -l
Sam Watkins
4
No entanto, eu sugeriria git rev-list HEAD --countmais do que a abordagem original apresentada no OP. Nos meus testes, git log --pretty=format:'' | wc -lé desligado por um.
ctrueden
3
O @ctrueden git log --oneline | wc -lnão está desativado em um (OS X 10.8.5).
Andy Stewart
111

git rev-list HEAD --count

git rev-list

git rev-list <commit>: Lista as confirmações alcançáveis ​​seguindo os links pai da confirmação fornecida (neste caso, HEAD ).

--count : Imprima um número informando quantas confirmações teriam sido listadas e suprima todas as outras saídas.

Jake Berger
fonte
101

Este comando retorna a contagem de confirmações agrupadas por confirmadores:

git shortlog -s

Resultado:

14 John lennon
9  Janis Joplin

Você pode querer saber que o -sargumento é a forma de contração de --summary.

Alex Pliutau
fonte
11
git shortlogpor si só não aborda a questão original do número total de confirmações (não agrupadas por autor). Use em git rev-list HEAD --countvez disso.
ctrueden
5
Impressionante! Você pode classificá-lo | sort -ntambém
Mohsen
54

Se você está procurando um identificador único e ainda legível para confirmações, o git description pode ser o ideal para você.

Bombe
fonte
2
Isso poderia funcionar e seria mais fácil de usar do que um algo personalizado. +1
VonC 24/03/09
2
Eu não sabia que o git descreve. Esse pequeno número entre o nome da tag e o sha1 é exatamente o que eu estava procurando. Obrigado.
Splo 25/03/09
2
Dê uma olhada no script GIT-VERSION-GEN e como ele é usado no repositório git, e script semelhante nas fontes do kernel do Linux (e como elas são usadas no Makefile).
Jakub Narębski 27/03/09
Isso fornece um ID exclusivo, mas não INCREMENTAL. Não funciona para mim. No entanto, a resposta de Ben Atkin oferece contagem de confirmação, que na prática deve ser incremental. A resposta de Aaron Digulla é mais certa, mas requer também mais trabalho.
JOM
2
Sim, isso ocorre porque o conceito de um ID incremental não faz sentido nos sistemas de controle de versão distribuídos.
06
34

Você não é o primeiro a pensar em um "número de revisão" no Git , mas ' wc' é bastante perigoso, pois o commit pode ser apagado ou esmagado, e a história revisitada.

O "número de revisão" foi especialmente importante para o Subversion, pois era necessário em caso de mesclagem (os SVN1.5 e 1.6 foram aprimorados nessa frente).

Você pode acabar com um gancho de pré-confirmação que incluiria um número de revisão no comentário, com um algoritmo que não envolve a pesquisa de todo o histórico de uma ramificação para determinar o número correto.

O Bazaar realmente apresentou esse algoritmo , e pode ser um bom ponto de partida para o que você deseja fazer.

(Como a resposta de Bombe aponta, o Git tem, na verdade, um algoritmo próprio, baseado na tag mais recente, mais o número de confirmações, além de um pouco de uma tecla SHA-1). Você deve ver (e votar) a resposta dele, se funcionar para você.


Para ilustrar a idéia de Aaron , você também pode anexar o hash de confirmação do Git no arquivo de "informações" de um aplicativo que você está distribuindo com seu aplicativo.

Dessa forma, a caixa about seria semelhante a:

Sobre a caixa

O número do aplicativo faz parte da confirmação, mas o 'arquivo de "informações" do aplicativo é gerado durante o processo de empacotamento, vinculando efetivamente um número de compilação do aplicativo a um ID de revisão técnica .

VonC
fonte
2
Atualizei meu script para trabalhar com o Xcode 3. Você pode pegar uma versão atualizada em gist.github.com/208825 .
Abizern 29/10/09
34

Você pode apenas usar:

git shortlog -s -n

Resultado:

 827  user one
    15  user two
     2  Gest 
demenvil
fonte
22

Uma maneira simples é:

 git log --oneline | wc -l

oneline Assegura que.

Jimmy Kane
fonte
1
'wc' não é reconhecido como um comando interno ou externo, programa operável ou arquivo em lote.
User815693
Bem, qual sistema você está usando? É um UNIX? /
Jimmy Kane
1
Isso também parece mais rápido se você tiver milhares de confirmações. Todos os outros comandos levam muito tempo.
Danny Coulombe
21

Para obtê-lo em uma variável, a maneira mais fácil é:

export GIT_REV_COUNT=`git rev-list --all --count`
John Gietzen
fonte
5
De fato, git rev-listé a ferramenta correta a ser usada, não git logcomo a outra diz.
Nayuki
1
Para contar o número de confirmações na linhagem para alcançar HEAD: git rev-list --first-parent | wc -l
200_success
Você não precisa wc -lapenas usar o --countinterruptor: git rev-list --all --count.
Slm
Obrigado @slm, atualizei a resposta. Embora, eu suspeito que a resposta original seja mais antiga que a --countprópria opção.
John Gietzen
@ JohnGietzen - oh sim, eu imaginei que 8-), estava apenas adicionando esse detalhe para ajudar.
SLM
17

O shortlog do Git é uma maneira de obter os detalhes da confirmação:

git shortlog -s -n

Isso fornecerá o número de confirmações seguidas pelo nome do autor. A opção -s remove todas as mensagens de confirmação para cada confirmação que o autor fez. Remova a mesma opção se desejar ver também as mensagens de confirmação. A opção -n é usada para classificar a lista inteira. Espero que isto ajude.

Sri Murthy Upadhyayula
fonte
2
git shortlogpor si só não aborda a questão original do número total de confirmações (não agrupadas por autor). Use em git rev-list HEAD --countvez disso.
precisa saber é o seguinte
8

git rev-parse --short HEAD

makuchaku
fonte
1
Produz um hash, enquanto um número foi solicitado.
Jesse Glick
4

Se você estiver usando apenas um ramo, como o master, acho que isso funcionaria muito bem:

git rev-list --full-history --all | wc -l

Isso produzirá apenas um número. Você pode alias para algo como

git revno

para tornar as coisas realmente convenientes. Para fazer isso, edite seu .git/configarquivo e adicione-o em:

[alias]
    revno = "!git rev-list --full-history --all | wc -l"

Isso não funcionará no Windows. Eu não sei o equivalente a "wc" para esse sistema operacional, mas escrever um script Python para fazer a contagem para você seria uma solução multiplataforma.

EDIT : obtenha contagem entre dois commits:


Eu estava procurando uma resposta que mostrasse como obter o número de confirmações entre duas revisões arbitrárias e não vi nenhuma.

git rev-list --count [older-commit]..[newer-commit]
NuclearPeon
fonte
3

Gere um número durante a construção e grave-o em um arquivo. Sempre que você fizer um release, confirme esse arquivo com o comentário "Build 147" (ou qualquer que seja o número da build atualmente). Não confirme o arquivo durante o desenvolvimento normal. Dessa forma, você pode mapear facilmente entre números de compilação e versões no Git.

Aaron Digulla
fonte
Se dois desenvolvedores distribuídos fizessem isso, seus números de compilação não colidiriam / interceptariam periodicamente? E se os dois fizessem uma compilação entre as mesmas rotações de um repositório compartilhado, ou talvez a colisão só ocorresse se um deles tivesse alterações não confirmadas no repositório compartilhado. Não tenho certeza.
hobs
Claro, mas o conflito diz o que você deve fazer: apenas converse com o outro cara ou sempre use um número maior. Lembre-se: Um número não pode curar magicamente um processo de construção quebrado. É apenas um lembrete ou sugestão de que você precisa verificar alguma coisa.
Aaron Digulla
1
Ah, sim, o arquivo mágico buildno.txt é confirmado junto com o resto. Boa abordagem para uma equipe pequena ou uma equipe grande que evita construções paralelas. O único lugar em que consigo pensar que isso pode não funcionar tão bem é para uma grande equipe que usa uma linguagem de script (python) que não precisa de um processo de criação (para atribuir uma única pessoa à construção).
hobs
3

Em nossa empresa, passamos do SVN para o Git. A falta de números de revisão foi um grande problema!

Faça git svn clonee marque a última confirmação de SVN pelo número de revisão do SVN:

export hr=`git svn find-rev HEAD`
git tag "$hr" -f HEAD

Em seguida, você pode obter o número da revisão com a ajuda de

git describe --tags --long

Este comando fornece algo como:

7603-3-g7f4610d

Significa: A última tag é 7603 - é a revisão do SVN. 3 - é a contagem de confirmações dele. Precisamos adicioná-los.

Portanto, o número da revisão pode ser contado por este script:

expr $(git describe --tags --long | cut -d '-' -f 1) + $(git describe --tags --long | cut -d '-' -f 2)
Matvey
fonte
1

O que eu costumava usar era:

git log | grep "^commit" | wc -l

Simples, mas funcionou.

Robert Massaioli
fonte
4
leva uma linha de mensagem de confirmação começando com "commit" para interromper a contagem. Por exemplo: "erros corrigidos e testes quebrados que acidentalmente enviei por último \ ncommit"
Paweł Polewicz 06/06/12
1

Usando a sintaxe do Bash,

$(git rev-list --count HEAD)

parece bom para a história puramente linear. Se você também quiser ter "números" de ramificações (com base em master), considere:

$(git rev-list --count $(git merge-base master HEAD)).$(git rev-list --count ^master HEAD)

Quando executado a partir de um checkout de master , você obtém simplesmente 1234.0ou algo parecido. Quando executado a partir de uma verificação geral de uma ramificação, você obtém algo como 1234.13, se houver 13 confirmações feitas nessa ramificação. Obviamente, isso é útil apenas na medida em que você baseia no máximo uma ramificação de um determinadomaster revisão.

--first-parent pode ser adicionado ao número micro para suprimir algumas confirmações decorrentes apenas da fusão de outras ramificações, embora isso provavelmente seja desnecessário.

Jesse Glick
fonte
1

Podes tentar

git log --oneline | wc -l

ou listar todos os commits realizados pelas pessoas que contribuem no repositório

git shortlog -s

fonte
1

git config --global alias.count 'rev-list --all --count'

Se você adicionar isso à sua configuração, basta referenciar o comando;

git count

Robert Pounder
fonte
0

Use o git shortlog assim

git shortlog -sn

Ou crie um alias (para terminal baseado em ZSH)

# show contributors by commits alias gcall="git shortlog -sn"

Ahmad Awais
fonte
0

Que tal fazer um alias?

alias gc="git rev-list --all --count"      #Or whatever name you wish
ferrugem
fonte