Поиск по сайту:

Как использовать Git Hooks для автоматизации коммитов


Перехватчики Git — это скрипты bash, которые запускаются до или после команд Git, таких как коммиты и push-уведомления. Они позволяют автоматизировать повторяющиеся действия в вашем репозитории, а также применять фильтры и проверки к рабочему процессу Git.

Что такое Git-хуки?

На самом деле хуки Git — это просто bash-скрипты со специальным именем в папке .git/hooks/ . Git будет автоматически вызывать эти функции при выполнении определенных задач, что позволит вам «подключиться» к рабочему процессу Git, чтобы изменить его с помощью собственного кода.

Репозитории Git инициализируются несколькими образцами; все, что вам нужно сделать, чтобы применить их, это раскомментировать расширение. Это означает, что вы сможете иметь только один скрипт для каждого хука, поэтому, если вы хотите сделать несколько вещей, вам нужно будет объединить их или делегировать другим скриптам.

Итак, для чего вы можете их использовать? Что ж, любая задача, которую может выполнить сценарий bash, будет работать. Двумя распространенными вариантами использования являются автоматическое тестирование и применение фильтров/проверок к исходящим фиксациям.

Тесты — важная часть любого рабочего процесса. Хотя хуки Git абсолютно не заменяют наличия надлежащего конвейера непрерывной интеграции/непрерывного развертывания (CI/CD), который будет запускать тесты перед проверкой и развертыванием, их локальное выполнение поможет вам обнаружить сбои до того, как они исчезнут.

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

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

  • до фиксации, после фиксации
  • предварительная отправка
  • после оформления заказа
  • фиксация-сообщение

Каждый хук принимает аргументы скрипта, доступ к которым можно получить с помощью $1$2 и т. д.

Делимся хуками Git

Git-хуки предназначены только для локального репозитория и не передаются на удаленный. Вы можете настраивать любые хуки Git, которые вам нужны, не затрагивая ваших коллег, чтобы вы могли, например, развернуть локальную среду тестирования, которая зависит от настроек вашего ПК, при каждом коммите, без каких-либо проблем.

Однако, если вы действительно хотите поделиться хуками Git со своей командой, вы можете создать для них новую папку, которая будет отслеживаться в Git, например .gitooks, и установить значение конфигурации для core.hooksPath:

git config core.hooksPath .githooks

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

Как использовать Git-хуки

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

Если вы хотите проверить содержимое коммитов, вы можете использовать git diff для отображения построчного сравнения, а затем выполнить поиск совпадений с помощью команды grep. В данном случае он блокирует любое использование функции Debug.Log путем выхода с ненулевым кодом:

<span class="kw1">if </span>test $(git diff --cached | grep -E "Debug.Log(" | wc -l) != 0 then
    exit 1
fi

Или вы можете проверить фактическое сообщение коммита. В образце перед отправкой используется аналогичный тест, но вместо этого выполняется поиск выходных данных git rev-list . Это проверяет коммиты, помеченные как незавершенные (WIP), и отказывается их отправлять.

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

В любом случае это так же просто, как запустить тестовую команду, получить статус выхода последней команды и выдать ошибку в случае сбоя. В этом примере выполняются тесты для приложения .NET:

#!/bin/sh
exec dotnet test "./UnitTests/UnitTests.csproj" --filter "Category!=Integration"

if [ $? -ne 0 ]; then
    echo "Tests must pass before commit!"
    exit 1
fi

Есть несколько инструментов, которые помогут в этом; Husky легко запустит тесты NodeJS с настройкой конфигурации в package.json, которая также будет применяться ко всем вашим товарищам по команде.

{
 "husky": {
  "hooks": {
   "pre-commit": "npm test",
   "pre-push": "npm test",
   "...": "..."
  }
 }
}

Однако это не замена реальным тестам в официальном репо. Существуют сценарии, в которых ваши локальные тесты могут пройти, но удаленные тесты не пройдут, а именно в случаях, когда вы не подготовите все изменения для принудительной отправки.




Все права защищены. © Linux-Console.net • 2019-2024