Git 커밋 수는 어떻게 얻습니까?


753

SVN 개정 번호와 같은 Git 저장소의 커밋 수를 얻고 싶습니다.

목표는 고유 한 증분 빌드 번호로 사용하는 것입니다.

나는 현재 Unix / Cygwin / msysGit에서 그렇게하고 있습니다 :

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

그러나 나는 그것이 약간의 해킹이라고 생각합니다.

더 좋은 방법이 있습니까? 실제로 wcGit이 필요하지 않거나 심지어 Git 이 없으면 멋지 므로 베어 Windows에서 작동 할 수 있습니다. 파일이나 디렉토리 구조를 읽으십시오 ...


1
흥미로운 답변을 여기에서 찾을 수 있습니다 : 개정 번호에 해당하는 git는 무엇입니까?
Sebastien Varrette

190
git rev-list HEAD --count git rev-list
Jake Berger

14
@ jberger : 귀하의 의견은 답변으로 전환되어야한다고 생각합니다.
utapyngo

@ utapyngo : 13 개의 다른 답변이 주어지면 매장 될 것이라고 알았습니다. 나는 한 여기를 게시 한 후.
Jake Berger

@ jberger,이 답변은 git1.7.0에서 작동하지 않습니다.
Vorac

답변:


1160

A는 개정 (대한 수를 커밋 얻으려면 HEAD, master하는 해시를 저지) :

git rev-list --count <revision>

모든 브랜치에서 커밋 수를 얻으려면 :

git rev-list --all --count

빌드 식별자에 이것을 사용하지 않는 것이 좋지만, 필요한 경우 구축하려는 지점의 수를 사용하는 것이 가장 좋습니다. 그렇게하면 동일한 개정판은 항상 같은 번호를 갖습니다. 모든 지점에 개수를 사용하면 다른 지점의 활동으로 인해 번호가 변경 될 수 있습니다.


27
git shortlog | grep -E '^[ ]+\w+' | wc -l총 수를 얻고 싶거나 git shortlog | grep -E '^[^ ]'모든 기고자에 대한 커밋 수를 얻으려는 경우.
skalee

2
지적 해 주셔서 감사합니다 wc -l. 미니멀리즘 FTW. 나는 그것을 내 대답에 포함시켰다.
Benjamin Atkin

17
이 솔루션은 해킹 git log --pretty=format:'' | wc -l되어 있고 (원래 질문에 제공된 접근 방식 과 유사 ) 올바르지 않습니다. 일치를 반전시키고 ( git shortlog | grep -Ev '^[ ]+\w+') 메시지가없는 커밋 (예 : "<none>")이 계산되지 않음을 확인하여이를 확인할 수 있습니다. 사용 git rev-list HEAD --count은 더 간결하고 정확합니다.
ctrueden

17
@ BenAtkin : 내 사과; 그것은 공격적이고 사실에 불과한 것이 었습니다. 응답 날짜에 대한 점. 당시에는 솔루션이 최상의 솔루션 일 것입니다. 그러나 나는 git rev-list HEAD --count지금 더 나은 해결책 이라는 나의 진술을지지한다 .
ctrueden

3
답변을 추가하고 이전 버전에서도 작동합니다.git log --oneline | wc -l
Jimmy Kane

155

git shortlog 한 가지 방법입니다.


5
타이 이것은 범위 내에서 커밋을 계산할 때 효과적이었습니다. git shortlog sha1..sha2
RJFalconer

1
그러나 git shortlog의 첫 번째 줄에는 커밋 수가 있습니다. 문제 해결됨.
Robert Massaioli

5
커밋 수는 커미터별로 그룹화되어 있지만 좋지 않습니다. git shortlog에서 줄을 셀 수는 있지만 어떤 이유로 터미널이 없으면 ssh에서 작동하지 않습니다 (pager?). asker의 독창적 인 솔루션이 최고입니다! 자식 로그 --pretty = format : ''| wc -l
Sam Watkins

4
그러나 git rev-list HEAD --countOP에 제공된 원래 접근 방식보다는 제안 할 것 입니다. 내 테스트에서 git log --pretty=format:'' | wc -l하나씩 벗어납니다.
ctrueden

3
@ctrueden git log --oneline | wc -l은 하나씩 꺼져 있지 않습니다 (OS X 10.8.5).
앤디 스튜어트

111

git rev-list HEAD --count

git rev-list

git rev-list <commit>: 주어진 커밋 (이 경우 HEAD ) 의 상위 링크를 따라 도달 할 수있는 커밋을 나열 합니다.

--count : 나열된 커밋 수를 나타내는 숫자를 인쇄하고 다른 모든 출력을 억제합니다.


101

이 명령은 커미터별로 그룹화 된 커밋 수를 반환합니다.

git shortlog -s

산출:

14 John lennon
9  Janis Joplin

-s인수가의 수축 형식 임을 알고 싶을 수도 있습니다 --summary.


11
git shortlog그 자체로는 커밋 수의 원래 질문 (저자별로 그룹화되지 않음)을 다루지 않습니다. git rev-list HEAD --count대신 사용하십시오 .
ctrueden

5
대박! 다음과 같은 방법으로 그것을 정렬 할 수 | sort -n
모흐센

54

커밋에 대한 독특하고 여전히 읽기 쉬운 식별자를 찾고 있다면 git describe 가 당신을위한 것일 수도 있습니다.


2
그것은 맞춤형 알고보다 작동하고 사용하기가 더 쉬울 것입니다. +1
VonC

2
나는 자식 설명을 몰랐다. 태그 이름과 sha1 사이의 작은 숫자는 내가 찾던 것입니다. 감사합니다.
Splo

2
GIT-VERSION-GEN 스크립트와 git 리포지토리에서 사용되는 방법 및 Linux 커널 소스의 유사한 스크립트 및 Makefile에서 사용되는 스크립트를 살펴보십시오.
Jakub Narębski

이것은 고유하지만 INCREMENTAL ID는 아닙니다. 나를 위해 작동하지 않습니다. 그러나 Ben Atkin의 답변은 커밋 수를 제공하며 실제로는 증가해야합니다. Aaron Digulla의 대답은 더 확실하지만 더 많은 작업이 필요합니다.
JOM

2
그렇습니다 . 증분 ID 의 개념 은 분산 버전 제어 시스템에서 의미가 없기 때문입니다.
Bombe

34

Git"개정 번호"에 대해 처음으로 생각하는 사람은 아니지만 ' wc'커밋이 지워지거나 찌그러지고 역사가 다시 방문 할 수 있기 때문에 매우 위험합니다.

"개정 번호"는 병합의 경우에 필요 했기 때문에 Subversion에 특히 중요했습니다 (SVN1.5 및 1.6이 개선되었습니다).

올바른 커밋 수 를 결정하기 위해 분기 의 모든 기록을 조회 하지 않는 알고리즘을 사용하여 주석에 개정 번호를 포함하는 사전 커밋 후크로 끝날 수 있습니다.

Bazaar는 실제로 그러한 알고리즘 을 생각해 냈으며 원하는 작업을 시작하기에 좋은 출발점이 될 수 있습니다.

(AS 봄베의 대답은 힘내 실제로 최근 태그 기반으로 자신의 알고리즘, 플러스 커밋의 수, 플러스 SHA-1 키의 비트를 가지고, 지적). 당신에게 도움이된다면 그의 대답을보아야한다.


Aaron의 아이디어 를 설명하기 위해 Git commit 해시를 애플리케이션 과 함께 배포 하는 애플리케이션의 "정보"파일에 추가 할 수도 있습니다 .

그러면 about 상자는 다음과 같습니다.

상자에 대해

애플리케이션 번호는 커밋의 일부이지만 패키징 프로세스 중에 '애플리케이션의 "정보"파일이 생성되어 애플리케이션 빌드 번호를 기술 개정 ID에 효과적으로 연결합니다 .


2
Xcode 3에서 작동하도록 스크립트를 업데이트 했습니다 . gist.github.com/208825 에서 최신 버전을 선택할 수 있습니다 .
Abizern

34

U는 다음을 사용할 수 있습니다.

git shortlog -s -n

결과 :

 827  user one
    15  user two
     2  Gest 

22

간단한 방법은 다음과 같습니다.

 git log --oneline | wc -l

oneline 그것을 보장합니다.


1
'wc'는 내부 또는 외부 명령, 작동 가능한 프로그램 또는 배치 파일로 인식되지 않습니다.
user815693

어떤 시스템을 사용하고 있습니까? – 그것은
지미 케인

1
커밋이 수천 개이면 더 빠릅니다. 다른 모든 명령은 시간이 너무 오래 걸립니다.
Danny Coulombe 2016 년

21

변수에 넣는 가장 쉬운 방법은 다음과 같습니다.

export GIT_REV_COUNT=`git rev-list --all --count`

5
실제로 다른 git rev-list도구 git log와 달리 사용하기에 올바른 도구 입니다.
Nayuki

1
계보에서 HEAD에 도달하기위한 커밋 수를 계산하려면 : git rev-list --first-parent | wc -l
200_success

스위치를 wc -l사용할 필요는 없습니다 --count: git rev-list --all --count.
slm

@ slm 감사합니다, 나는 대답을 업데이트했습니다. 그러나 원래 답변이 --count스위치 자체 보다 오래되었다고 생각합니다 .
John Gietzen

@ JohnGietzen-아, 그래 8-)는이 세부 사항을 추가하여 도움을 줄 것이라고 생각했습니다.
slm

17

Git shortlog는 커밋 세부 정보를 얻는 한 가지 방법입니다.

git shortlog -s -n

이것은 커밋 수와 저자 이름을 부여합니다. -s 옵션은 작성자가 작성한 각 커밋에 대한 모든 커밋 메시지를 제거합니다. 커밋 메시지도 보려면 동일한 옵션을 제거하십시오. -n 옵션은 전체 목록을 정렬하는 데 사용됩니다. 도움이 되었기를 바랍니다.


2
git shortlog그 자체로는 커밋 수의 원래 질문 (저자별로 그룹화되지 않음)을 다루지 않습니다. git rev-list HEAD --count대신 사용하십시오 .
ctrueden



4

master와 같은 하나의 브랜치를 사용하는 경우 이것이 효과적이라고 생각합니다.

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

숫자 만 출력합니다. 별명을 지정할 수 있습니다

git revno

정말 편리하게 만들 수 있습니다. 이렇게하려면 .git/config파일을 편집 하고 다음을 추가하십시오.

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

Windows에서는 작동하지 않습니다. 해당 OS에 대해 "wc"에 해당하는 것을 모르지만 파이썬 스크립트를 작성하여 계산을 수행하는 것은 다중 플랫폼 솔루션이 될 것입니다.

편집 : 두 커밋 사이에 카운트를 가져옵니다.


두 개의 임의 개정판 사이에서 커밋 수를 얻는 방법을 보여 주었고 아무것도 보지 못했습니다.

git rev-list --count [older-commit]..[newer-commit]

3

빌드 중에 숫자를 생성하여 파일에 씁니다. 릴리스 할 때마다 "빌드 147"주석 (또는 현재 빌드 번호가 무엇이든)으로 해당 파일을 커밋하십시오. 정상적인 개발 중에 파일을 커밋하지 마십시오. 이런 식으로 Git에서 빌드 번호와 버전을 쉽게 매핑 할 수 있습니다.


분산 된 두 개발자가 빌드 번호가 주기적으로 충돌 / 교차하지 않습니까? 만약 그들이 같은 레포지토리의 레포지토리 사이에 빌드를했다면, 또는 레포지토리에 커밋되지 않은 변경 사항이있을 경우에만 충돌이 발생할 수 있습니다. 확실하지 않다.
호브

그러나 갈등은 무엇을해야하는지 알려줍니다 : 다른 사람과 대화하거나 항상 더 높은 숫자를 사용하십시오. 기억하십시오 : 숫자가 깨진 빌드 프로세스를 마술처럼 치료할 수는 없습니다. 그것은 단지의 알림 또는 힌트 당신이 뭔가를 점검 할 필요가있다.
Aaron Digulla

1
예, magic buildno.txt 파일은 나머지와 함께 커밋됩니다. 소규모 팀 또는 병렬 빌드를 피하는 대규모 팀에 적합한 접근 방식. 내가 잘 작동하지 않을 수 있다고 생각할 수있는 장소 만 (빌드를 할 사람을 지정하기 위해) 빌드 프로세스가 필요없는 스크립트 언어 (파이썬)를 사용하는 대규모 팀을위한 것입니다.
호브

3

우리 회사에서는 SVN에서 Git으로 옮겼습니다. 개정 번호 부족은 큰 문제였습니다!

수행 git svn clone한 다음 마지막 SVN은 SVN 개정 번호 커밋 태그 :

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

그런 다음의 도움으로 개정 번호를 얻을 수 있습니다

git describe --tags --long

이 명령은 다음과 같은 것을 제공합니다.

7603-3-g7f4610d

의미 : 마지막 태그는 7603입니다-SVN 개정입니다. 3-커밋 횟수입니다. 그것들을 추가해야합니다.

따라서이 스크립트로 개정 번호를 계산할 수 있습니다.

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

1

내가 사용했던 것은 다음과 같습니다.

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

간단하지만 효과가있었습니다.


4
카운트를 중단하려면 "commit"으로 시작하는 하나의 커밋 메시지 행이 필요합니다. 예를 들면 : "나는 실수 ncommit \ 마지막에 밀어 것을 실수와 깨진 테스트 수정"
파블 Polewicz

1

Bash 구문을 사용하면

$(git rev-list --count HEAD)

순전히 선형 이력에 적합합니다. 때때로 분기에서 "숫자"를 원한다면 (기준으로 master) 다음을 고려하십시오.

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

의 체크 아웃에서 실행 master하면 간단하게 1234.0또는 이와 유사하게됩니다. 지점의 체크 아웃에서 실행될 때 1234.13해당 지점에 13 개의 커밋이있는 경우 와 같은 것을 얻습니다 . 분명히 이것은 주어진 master개정 에서 최대 하나의 브랜치를 기반으로하는 한에만 유용합니다 .

--first-parent 다른 분기를 병합하는 것만으로 발생하는 커밋을 억제하기 위해 마이크로 숫자에 추가 할 수 있지만 아마도 불필요합니다.


1

당신은 시도 할 수 있습니다

git log --oneline | wc -l

또는 저장소에 기여한 사람들이 수행 한 모든 커밋을 나열

git shortlog -s

1

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

이것을 구성에 추가하면 명령을 참조하기 만하면됩니다.

git count


0

이처럼 git shortlog를 사용하십시오.

git shortlog -sn

또는 별명 작성 (ZSH 기반 터미널의 경우)

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


0

어때요 alias?

alias gc="git rev-list --all --count"      #Or whatever name you wish
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.