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

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

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

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

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

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

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

26 ответов

Решение

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

git rev-list --count <revision>

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

git rev-list --all --count

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

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

Эта команда возвращает количество коммитов, сгруппированных по коммиттерам:

git shortlog -s

git shortlog -s
14 John lennon
9  Janis Joplin

git rev-list HEAD --count

git rev-list

git rev-list <commit>: Список коммитов, которые доступны, следуя родительским ссылкам из данного коммита (в данном случае, HEAD).

--count: Выведите число, указывающее, сколько коммитов было бы указано в списке, и исключите все остальные выходные данные.

Если вы ищете уникальный и все еще вполне читаемый идентификатор для коммитов, вам может пригодиться git description.

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

git shortlog -s -n

Результат:

 827  user one
    15  user two
     2  Gest 

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

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

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

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

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


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

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

О коробке

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

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

 git log --oneline | wc -l

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

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

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

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

git shortlog -s -n

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

есть несколько классных способов сделать это -

  • Первый метод

git shortlog -s

Эта команда выводит список коммитов, сделанных всеми пользователями, внесшими свой вклад в репозиторий.

      956 Pankaj Tanwar
235 The Ninja
540 The Hardcore Geek
664 The Ever Shining Star
984 The Experienced Man

Просто, чтобы подсчитать общее количество коммитов -

git shortlog -s | grep "Pankaj Tanwar"

он печатает -

      956 Pankaj Tanwar
  • Еще один чистый и классный метод -
      git rev-list HEAD --author="Pankaj Tanwar" --count 

Чтобы подсчитать общее количество добавленных строк кода и общее количество запросов на вытягивание, проверьте этот блог .

Если вы просто используете одну ветку, такую ​​как 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-parse - короткая ГОЛОВА

Следующая команда выводит общее количество коммитов в текущей ветке.

git shortlog -s -n  | awk '{ sum += $1; } END { print sum; }' "$@"

Он состоит из двух частей:

  1. Вывести общее количество журналов, сгруппированных по авторам (git shortlog -s -n)

    Пример вывода

      1445  John C
      1398  Tom D
      1376  Chrsitopher P
       166  Justin T
       166  You
    
  2. Суммируйте общее количество коммитов каждого автора, то есть первый аргумент каждой строки, и распечатайте результат (awk '{ sum += $1; } END { print sum; }' "$@")

    Используя тот же пример, что и выше, он подведет итог 1445 + 1398 + 1376 + 166 + 166. Следовательно, вывод будет:

      4,551
    

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

Используя синтаксис 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 может быть добавлено к микро-номеру, чтобы подавить некоторые коммиты, возникающие только при слиянии других веток, хотя это, вероятно, не нужно.

git shortlog сам по себе не отвечает на исходный вопрос об общем количестве коммитов (не сгруппированных по авторам)

Это правда, и git rev-list HEAD --count остается самым простым ответом.

Однако с Git 2.29 (4 квартал 2020 г.) " git shortlog" (man) стал более точным.
Его научили группировать коммиты по содержимому строк трейлера, например" Reviewed-by:"," Coauthored-by:", и т.д.

Смотрите commit 63d24fa, commit 56d5dde, commit 87abb96, commit f17b0b9, commit 47beb37, commit f0939a0, commit 92338c4 (27 сентября 2020 г.) и commit 45d93eb (25 сентября 2020 г.) Джефф Кинг (peff).
(Слияние Junio ​​C Hamano - gitster- в коммите 2fa8aac, 04.10.2020)

shortlog: позволяет указать несколько групп

Подписано: Джефф Кинг

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

Этот патч учит короткий журнал принимать несколько --group параметры в командной строке и извлекать данные из всех из них.

Это позволяет запускать:

        git shortlog -ns --group=author --group=trailer:co-authored-by  

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

Реализация в основном проста. " group"enum становится битовым полем, а ключ трейлера становится списком.
Я не утруждал себя реализацией многогрупповой семантики для чтения из стандартного ввода-вывода. Это было бы возможно, но существующий код сопоставления делает это неудобным, и я сомневаюсь, что кто-нибудь заботы.

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

Есть одна тонкость: теперь мы заботимся о случае, когда групповой бит не установлен (в этом случае мы по умолчанию показываем автора).
Звонящий в builtin/log.c необходимо адаптировать, чтобы явно спрашивать авторов, а не полагаться на shortlog_init(). Можно было бы с помощью некоторой гимнастики заставить это работать как есть, но это не стоит того для одного звонящего.

git shortlogтеперь включает в свою справочную страницу:

--group=<type>

Групповые коммиты на основе <type>. Если нет --group указана опция, по умолчанию author. <type> один из:

  • author, коммиты сгруппированы по автору
  • committer, коммиты группируются по коммиттеру (так же, как -c)

Это псевдоним для --group=committer.

git shortlogтеперь также включает в свою справочную страницу:

Если --groupуказывается несколько раз, коммиты подсчитываются для каждого значения (но опять же, только один раз для каждого уникального значения в этом коммите). Например, git shortlog --group=author --group=trailer:co-authored-by учитываются как авторы, так и соавторы.

В нашей компании мы перешли из 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)

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

Ты можешь попробовать

git log --oneline | wc -l

или перечислить все коммиты, сделанные людьми, участвующими в репозитории

git shortlog -s

Тот, который я использовал, был:

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

Просто, но это сработало.

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

Если вы добавите это в свою конфигурацию, вы можете просто сослаться на команду;

git count

Как насчет создания alias?

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

Чтобы получить количество коммитов, которые различаются между двумя ветвями, например, функциональной ветвью и целевым, используйте:

git rev-list --count feature_branch..target_branch

Вы можете попробовать это в git bash

  1. git log --author="Your-Email-or-Name" --pretty=oneline

это дает вам список

  1. git log --author="Your-Email-or-Name" --pretty=oneline | wc -l

это дает вам счет

Используйте Git Shortlog так же, как это

git shortlog -sn

Или создайте псевдоним (для терминала на основе ZSH)

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

Другие вопросы по тегам