Как мне получить git commit count?
Я хотел бы получить число коммитов моего репозитория Git, немного похожее на номера ревизий SVN.
Цель состоит в том, чтобы использовать его как уникальный, увеличивающийся номер сборки.
В настоящее время я делаю так, на Unix / Cygwin/msysGit:
git log --pretty=format:'' | wc -l
Но я чувствую, что это немного халтура.
Есть ли лучший способ сделать это? Было бы здорово, если бы мне на самом деле не нужно было wc или даже Git, чтобы он мог работать на голых окнах. Просто прочитайте файл или структуру каталогов...
20 ответов:
Чтобы получить количество фиксаций для ревизии (
HEAD,master, хэш коммита):git rev-list --count <revision>Чтобы получить количество фиксаций во всех ветвях:
git rev-list --all --countЯ не рекомендую использовать это для идентификатора сборки, но если вы должны, вероятно, лучше использовать счетчик для ветви, против которой вы строите. Таким образом, одна и та же ревизия всегда будет иметь один и тот же номер. Если вы используете счетчик для всех ветвей, активность на других ветвях может изменить число.
git rev-list HEAD --count
git rev-list <commit>: Перечислите коммиты, доступные по родительским ссылкам из данного коммита (в данном случае HEAD).
--count: выведите число, указывающее, сколько коммитов было бы перечислено, и подавите все остальные выходные данные.
Эта команда возвращает количество коммитов, сгруппированных по коммиттерам:
git shortlog -s git shortlog -s 14 John lennon 9 Janis Joplin
Если вы ищете уникальный и все еще вполне читаемый идентификатор для коммитов, git describe может быть как раз то, что вам нужно.
Вы не первый, кто думает о "номере ревизии" в Git, но '
wc' довольно опасно, так как фиксация может быть стерта или раздавлена, а история пересмотрена."номер редакции" был особенно важен для Subversion, так как онбыл необходим в случае слияния (SVN1.5 и 1.6 улучшились на этом фронте).
Вы могли бы закончить с крюком предварительной фиксации, который включал бы номер редакции в комментарий, с алгоритмом не включая просмотр всей истории ветви, чтобы определить правильное число.
Базар на самом деле придумал такой алгоритм , и это может быть хорошей отправной точкой для того, что вы хотите сделать.
(Как указывает ответ Bombe, Git фактически имеет собственный алгоритм, основанный на последнем теге, плюс количество коммитов, плюс бит ключа SHA-1). Вы должны увидеть (и upvote) его ответ, если он работает для ты.
Чтобы проиллюстрировать идею Аарона, вы также можете добавить хэш git commit в файл "info" приложения, который вы распространяете вместе с вашим приложением.
Таким образом, поле about будет выглядеть следующим образом:
Номер приложения является частью фиксации, но "информационный файл" приложения генерируется в процессе упаковки, эффективно связывая номер сборки приложения С технической ревизией id .
Чтобы получить его в переменную, самый простой способ:
export GIT_REV_COUNT=`git rev-list --all --count`
Git shortlog-это один из способов получить сведения о фиксации:
git shortlog -s -nЭто даст число коммитов, за которыми следует имя автора. Параметр-s удаляет все сообщения о фиксации для каждой фиксации, выполненной автором. Удалите эту же опцию, если вы хотите также видеть сообщения о фиксации. Параметр-n используется для сортировки всего списка. Надеюсь, это поможет.
Есть хороший вспомогательный скрипт, который люди Git используют, чтобы помочь сгенерировать полезный номер версии на основе описания Git. Я показываю сценарий и объясняю его в своем ответе на Как бы вы включили текущий идентификатор фиксации в файлы проекта Git?.
Генерирует число во время сборки и записывает его в файл. Всякий раз, когда вы делаете релиз, зафиксируйте этот файл с комментарием "Build 147" (или каким бы ни был номер сборки в данный момент). Не фиксируйте файл во время нормальной разработки. Таким образом, вы можете легко сопоставить номера сборок и версии в Git.
Если вы используете только одну ветвь, такую как 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, чтобы сделать подсчет для вас, было бы мультиплатформенным решением.
В нашей компании мы перешли из 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)
Используя синтаксис 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 log --oneline | wc -lИли перечислить все коммиты, сделанные людьми, вносящими вклад в репозиторий
git shortlog -s
git config --global alias.count 'rev-list --all --count'Если вы добавите это в свою конфигурацию, вы можете просто сослаться на команду;
git count
Используйте git shortlog вот так
git shortlog -snИли создать псевдоним (для терминала на основе ZSH)
# show contributors by commits alias gcall="git shortlog -sn"

Comments