Другое

Подсчёт коммитов Git как номер сборки: Полное руководство

Узнайте самые эффективные методы получения количества коммитов Git для номеров сборки. Изучите стандартные команды, решения для Windows и интеграции с системами сборки.

Как получить количество коммитов в Git для использования в качестве номера сборки?

Я ищу способ получить общее количество коммитов в репозитории Git, аналогично номерам ревизий в SVN. Моя цель - использовать это количество в качестве уникального, увеличивающегося номера сборки.

В настоящее время я использую этот подход в Unix/Cygwin/msysGit:

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

Однако я беспокоюсь, что это может считаться “хаком”. Существует ли более эффективный или стандартный способ получить количество коммитов? Идеально было бы найти решение, которое не зависит от внешних инструментов, таких как wc или даже Git, чтобы оно могло работать на чистой установке Windows, читая файлы или структуру каталогов напрямую.

Самый стандартный и эффективный метод получения количества коммитов Git для использования в качестве номера сборки — это git rev-list --count HEAD, который напрямую выводит общее количество коммитов в текущей ветке. Этот подход быстрее разбора вывода log и широко признается как правильный метод Git для получения количества коммитов.

Содержание

Стандартные методы команд Git

Основной метод: git rev-list --count HEAD

Наиболее эффективная и рекомендуемая команда для получения общего количества коммитов:

bash
git rev-list --count HEAD

Эта команда выводит общее количество коммитов в текущей ветке, аналогично тому, как работают номера ревизий в SVN. Согласно ответам на [Stack Overflow], это считается “правильным инструментом” для этой цели и работает быстрее, чем альтернативы, особенно для репозиториев с тысячами коммитов.

Альтернативные стандартные методы

  1. Для всех веток вместе:

    bash
    git rev-list --all --count
    
  2. Для конкретных веток:

    bash
    git rev-list --count main
    git rev-list --count develop
    
  3. Использование shortlog (полезно для подсчета коммитов конкретных авторов):

    bash
    git shortlog -sn --all
    

Команда git shortlog показывает авторов и количество их коммитов, которые можно суммировать для получения общего количества, хотя этот способ менее прямолинеен, чем rev-list --count.


Интеграция с системами сборки

Интеграция с Fastlane

Для разработки под iOS/macOS [fastlane] предоставляет встроенное действие для этого:

ruby
build_number = number_of_commits(all: true)
increment_build_number(build_number: build_number)

Это автоматически использует количество коммитов и соответственно увеличивает номер сборки.

Номер сборки в Xcode

Как показано в [GitHub gist], вы можете напрямую интегрировать количество коммитов Git в номера сборки Xcode. Это создает схему номера сборки, подобную 123 (где 123 - количество коммитов).

Интеграция с Jenkins

В Jenkins вы можете использовать количество коммитов Git для отслеживания номеров сборки для конкретных коммитов. Обсуждение на [Stack Overflow] показывает, как Jenkins может связывать номера сборки с данными Git-коммитов.


Решения для Windows

Собственные команды Git в Windows

Команда git rev-list --count HEAD работает нативно в Windows через:

  • Git for Windows
  • Git Bash
  • Cygwin
  • MSYS2

Решения для PowerShell

Для пользователей PowerShell можно использовать:

powershell
$commitCount = (git rev-list --count HEAD).Trim()
Write-Output "Номер сборки: $commitCount"

Решения с использованием внешних инструментов

Если вам нужно решение, которое не зависит от установленного Git, вам придется напрямую анализировать структуру каталога .git. Однако это сложно, потому что:

  1. Git использует объектное хранилище (хэши SHA-1)
  2. Вам нужно будет обходить каталог .git/objects
  3. Вам нужно будет обрабатывать pack-файлы и отдельные объекты
  4. Вам нужно будет понимать объектную модель Git

Обсуждение на Reddit предлагает подход “клонирования с нуля”:

bash
git clone --template= -nsq --no-tags . `mktemp -d`
git -C $_ rev-list --count @

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


Вопросы производительности

Сравнение производительности

  • git rev-list --count HEAD: Самый быстрый, напрямую подсчитывает коммиты без разбора деталей
  • git log --pretty=format:'' | wc -l: Медленнее, обрабатывает полные детали каждого коммита
  • git shortlog -sn --all: Средняя скорость, обрабатывает информацию об авторах
  • git rev-list HEAD | wc -l: Похож на метод с log, но немного быстрее

Для репозиториев с тысячами коммитов разница в производительности становится значительной. Как отмечено в исследованиях, git rev-list “также быстрее, если у вас тысячи коммитов”.

Стратегии кэширования

Для систем сборки рассмотрите возможность кэширования количества коммитов, чтобы избежать пересчета при каждой сборке:

bash
# Кэширование в файл
git rev-list --count HEAD > build_number.txt
BUILD_NUMBER=$(cat build_number.txt)

Альтернативные подходы

Номера сборки на основе тегов

Вместо простого количества коммитов можно использовать количество коммитов с последнего тега:

bash
git describe --tags --long | cut -d- -f2

Это дает вам число вроде “42” (означающее 42 коммита с последнего тега).

Номера сборки на основе даты

Для некоторых вариантов использования подход на основе даты может быть более полезным:

bash
git log -1 --format=%cd --date=format:%Y%m%d%H%M

Гибридный подход

Объедините семантическое версионирование с количеством коммитов:

bash
VERSION=$(git describe --tags --long)
echo "$VERSION" | sed 's/-g.*$//'  # Удалить хэш коммита

Это дает что-то вроде “v1.2.3-42”, где 42 - количество коммитов с v1.2.3.


Заключение

Команда git rev-list --count HEAD является стандартным и наиболее эффективным методом получения количества коммитов Git для использования в качестве номера сборки. Она работает на разных платформах, включая Windows через Git Bash или Git for Windows. Хотя ваш текущий подход git log --pretty=format:'' | wc -l работает, он менее эффективен и не считается стандартным методом.

Для сред Windows без Git вам придется либо установить Git, либо реализовать сложное решение, которое напрямую анализирует каталог .git. Преимущества производительности git rev-list --count делают установку Git worthwhile, даже если вы используете его в основном для этой цели.

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

Источники

  1. Stack Overflow - Как получить количество коммитов Git?
  2. GeeksforGeeks - Как получить количество коммитов Git?
  3. Документация Fastlane - number_of_commits
  4. GitHub Gist - Использование количества коммитов git в качестве номера сборки Xcode
  5. Reddit - Есть ли способ получить количество git-коммитов без использования команды git?
  6. Koen Woortman - Получение общего количества git-коммитов через командную строку
Авторы
Проверено модерацией
Модерация