Как я могу получить количество коммитов Git?


753

Я хотел бы получить количество коммитов моего Git-репозитория, немного похожее на номера ревизий SVN.

Цель состоит в том, чтобы использовать его как уникальный, увеличивающийся номер сборки.

В настоящее время я делаю так, на Unix / Cygwin / msysGit:

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

Но я чувствую, что это немного взломать.

Есть ли лучший способ сделать это? Было бы здорово, если бы я на самом деле не нуждался wcили даже не использовал Git, чтобы он мог работать на голой Windows. Просто прочитайте файл или структуру каталогов ...


1
Вы можете найти интересные ответы здесь: что такое git-эквивалент для номера ревизии?
Себастьян Варрет

190
git rev-list HEAD --count git rev-list
Джейк Бергер

14
@jberger: я думаю, что ваш комментарий должен быть преобразован в ответ.
Utapyngo

@utapyngo: учитывая 13 других ответов, я знал, что это будет похоронено. Я разместил это здесь тогда.
Джейк Бергер

@jberger, этот ответ не работает для git1.7.0.
Vorac

Ответы:


1160

Чтобы получить коммит количества для пересмотра ( HEAD, master, коммит хэш):

git rev-list --count <revision>

Чтобы получить количество коммитов по всем веткам:

git rev-list --all --count

Я рекомендую не использовать это для идентификатора сборки, но если вам нужно, вероятно, лучше использовать счетчик для ветви, против которой вы строите. Таким образом, одна и та же ревизия всегда будет иметь одинаковый номер. Если вы используете счетчик для всех филиалов, активность в других филиалах может изменить номер.


27
git shortlog | grep -E '^[ ]+\w+' | wc -lесли вы хотите получить общее количество и git shortlog | grep -E '^[^ ]'если вы хотите получить количество коммитов для каждого участника.
Скали

2
Спасибо за указание wc -l. Минимализм FTW. Я включил это в свой ответ.
Бенджамин Аткин

17
Это решение является как хакерским (аналогично git log --pretty=format:'' | wc -lподходу, приведенному в исходном вопросе), так и неверным: вы можете увидеть это, перевернув match ( 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
Джимми Кейн

155

git shortlog это один из способов.


5
Ty. Это сработало для меня при подсчете коммитов в диапазоне; git shortlog sha1..sha2
RJFalconer

1
Да, первая строка git shortlog содержит количество коммитов. Задача решена.
Роберт Массайоли

5
Количество коммитов сгруппировано по коммиттеру, не так хорошо. Может подсчитывать строки в git shortlog, но по какой-то причине это не работает через ssh без терминала (пейджер?). Оригинальное решение от asker - лучшее! git log --pretty = формат: '' | wc -l
Сэм Уоткинс

4
Однако я бы предложил, git rev-list HEAD --countа не оригинальный подход, приведенный в ОП. В моих тестах 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 description .


2
Это может сработать и будет более простым в использовании, чем индивидуальный алгоритм. +1
VonC

2
Я не знал, что Git описать. Это маленькое число между именем тега и sha1 как раз то, что я искал. Спасибо.
Splo

2
Взгляните на сценарий GIT-VERSION-GEN и его использование в репозитории git, а также на похожие сценарии в исходных кодах ядра Linux (и как они используются в Makefile).
Якуб Наребски

Это дает уникальный, но не INCREMENTAL ID. Не работает для меня Однако ответ Бена Аткина предлагает количество коммитов, которое на практике должно быть постепенным. Ответ Аарона Дигуллы более уверен, но требует также больше работы.
JOM

2
Да, это потому , что понятие из дополнительных ID не имеет никакого смысла с распределенными системами контроля версий.
Бомба

34

Вы не первый, кто задумывается о «номере ревизии» в Git , но « wc» довольно опасен, поскольку коммит можно стереть или сжать, а историю пересмотреть.

«Номер редакции» был особенно важен для Subversion, поскольку он был необходим в случае слияния (SVN1.5 и 1.6 улучшились в этом направлении).

Вы можете получить хук предварительной фиксации, который будет включать номер комментария в комментарии, с алгоритмом, не предусматривающим поиск всей истории ветви для определения правильного номера.

Базар на самом деле придумал такой алгоритм , и он может стать хорошей отправной точкой для того, что вы хотите сделать.

(Как указывает ответ Bombe , Git на самом деле имеет собственный алгоритм, основанный на последнем теге, плюс количество коммитов, плюс немного ключа SHA-1). Вы должны увидеть (и подтвердить) его ответ, если он работает для вас.


Чтобы проиллюстрировать идею Аарона , вы также можете добавить хеш коммита Git в файл «info» приложения, который вы распространяете вместе с вашим приложением.

Таким образом, окно about будет выглядеть так:

О коробке

Аппликативный номер является частью фиксации, но «файл информации» приложения генерируется во время процесса упаковки, эффективно связывая аппликативный номер сборки с идентификатором технической версии .


2
Я обновил свой скрипт для работы с Xcode 3. Вы можете получить актуальную версию с gist.github.com/208825 .
Abizern

34

Вы можете просто использовать:

git shortlog -s -n

Результат:

 827  user one
    15  user two
     2  Gest 

22

Простой способ это:

 git log --oneline | wc -l

oneline гарантирует это.


1
«wc» не распознается как внутренняя или внешняя команда, работающая программа или пакетный файл.
user815693

Ну, какую систему вы используете? Это UNIX? /
Джимми Кейн

1
Это кажется быстрее, если у вас есть тысячи коммитов. Все остальные команды занимают слишком много времени.
Дэнни Куломб

21

Чтобы получить его в переменную, самый простой способ:

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

5
Действительно, git rev-listэто правильный инструмент для использования, а не git logкак говорят другие.
Наюки

1
Чтобы подсчитать количество коммитов в линии для достижения HEAD: git rev-list --first-parent | wc -l
200_success

Вам не нужно wc -lпросто использовать --countпереключатель: git rev-list --all --count.
Slm

Спасибо @slm, я обновил ответ. Хотя я подозреваю, что оригинальный ответ старше самого --countкоммутатора.
Джон Гитцен

@JohnGietzen - о, да, я подумал, что 8-) просто добавил эту деталь, чтобы помочь.
SLM

17

Git shortlog - это один из способов получить подробную информацию о коммите:

git shortlog -s -n

Это даст количество коммитов, за которыми следует имя автора. Опция -s удаляет все сообщения о коммите для каждого коммита, который сделал автор. Удалите ту же опцию, если вы хотите видеть также сообщения о коммите. Опция -n используется для сортировки всего списка. Надеюсь это поможет.


2
git shortlogсам по себе не решает исходный вопрос об общем количестве коммитов (не сгруппирован по автору). Используйте git rev-list HEAD --countвместо этого.
ctrueden


7

Есть хороший вспомогательный скрипт, который люди Git используют для создания полезного номера версии на основе описания Git. Я показываю сценарий и объясняю его в своем ответе на вопрос: Как бы вы включили текущий идентификатор фиксации в файлы проекта Git? ,


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. Я не знаю эквивалента «wc» для этой ОС, но написание Python-скрипта для подсчета будет многоплатформенным решением.

РЕДАКТИРОВАТЬ : Получить счет между двумя коммитами:


Я искал ответ, который бы показал, как получить количество коммитов между двумя произвольными ревизиями, и не увидел ни одного.

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

3

Сгенерируйте число во время сборки и запишите его в файл. Всякий раз, когда вы делаете релиз, фиксируйте этот файл с комментарием «Build 147» (или каким-либо другим номером сборки). Не фиксируйте файл во время обычной разработки. Таким образом, вы можете легко сопоставлять номера сборки и версии в Git.


Если бы два распространяемых разработчика делали это, не сталкивались ли бы их номера сборок периодически? Что, если они оба выполнили сборку между одними и теми же оборотами общего репо, или, возможно, столкновение произошло бы только в том случае, если были внесены изменения, не зафиксированные в общем репо. Точно сказать не могу.
варенье

Конечно, конфликт говорит вам, что делать: просто поговорите с другим парнем или всегда используйте большее число. Помните: число не может волшебным образом вылечить сломанный процесс сборки. Это просто напоминание или подсказка, что вам нужно что-то проверить.
Аарон Дигулла

1
Ах, да, волшебный файл buildno.txt фиксируется вместе с остальными. Хороший подход для небольшой команды или большой команды, которая избегает параллельных сборок. Единственное место, о котором я могу думать, что это может не сработать, это для большой команды, использующей язык сценариев (python), который не нуждается в процессе сборки (чтобы назначить одного человека для сборки).
вар

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
требуется одна строка сообщения о коммите, начинающаяся с «коммита», чтобы разбить счетчик. Например: «исправленные ошибки и неудачные тесты, которые я случайно нажал в прошлом \ ncommit»
Павел Полевич

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"


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.