Реализация обработчиков Git

Завершено

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

Крючки Git предлагают отличную возможность. Они служат механизмом выполнения пользовательских скриптов в ответ на значительные события жизненного цикла Git, такие как фиксации, слияния и отправки. Скрипты, расположенные в каталоге git\hooks репозитория, обеспечивают практически неограниченную гибкость в автоматизации задач разработки программного обеспечения и применении стандартов разработки.

Реализация перехватчиков Git

Начнем с изучения обработчиков Git на стороне клиента. Перейдите в каталог репозитория .git\hooks— вы найдете там много файлов с расширением sample. Это расширение не только указывает на их назначение, но и эффективно предотвращает их выполнение. Имена файлов определяют действия Git, которые активируют их выполнение после удаления sample расширения.

Снимок экрана: файлы перехватчика Git для автоматизации.

Переименуйте файл предварительной фиксации sample в предварительной фиксации. Как указывает имя файла, скрипт, который он содержит, будет выполняться всякий раз при вызове действия фиксации Git. Фиксация следует только в том случае, если скрипт предварительной фиксации завершается с возвращаемым значением 0.

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

#!/bin/sh

В операционных системах Linux — #! префикс указывает на загрузчик программы, что остальная часть файла содержит скрипт для интерпретации, а /bin/sh — полный путь к интерпретатору, который следует использовать.

Хотя Git для Windows поддерживает команды Bash и скрипты оболочки, при назначении путей файловой системы он не соответствует тому же соглашению. Вместо этого необходимо предоставить полный путь к файлу sh.exe, начиная с буквы диска.

Однако есть дополнительная предостережение, которое приводит к тому, что Git для Windows по умолчанию устанавливается в каталоге C:\Program Files. Так как этот каталог содержит пробел в его имени, результирующий путь к файлу sh.exe будет интерпретирован как два отдельных пути, что приведет к сбою. Чтобы избежать этого, необходимо добавить одну обратную косую черту (\) перед пробелом, чтобы служить escape-символом. Фактически при использовании 64-разрядной версии Git для Windows первая строка скрипта должна иметь следующий формат:

#!C:/Program\ Files/Git/usr/bin/sh.exe

Как это сделать

Как использовать недавно обнаруженные функциональные возможности скриптов предварительной фиксации Git? Как мешать вам случайно утечки секретов на GitHub?

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

#!C:/Program\ Files/Git/usr/bin/sh.exe
matches=$(git diff-index --patch HEAD | grep '^+' | grep -Pi 'password|secret')
if [ ! -z "$matches" ]
then
  cat <<\EOT
Error: Words from the blocked list were present in the diff:
EOT
echo $matches
exit 1
fi

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

Принцип работы

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

Там больше:

Другие распространенные варианты использования скриптов перехватчика предварительной фиксации включают форматирование кода, подкладку или выполнение пользовательских тестов, чтобы убедиться, что фиксация соответствует стандартам проекта. Подготовка к фиксации msg выполняется перед запуском редактора сообщений фиксации. Он позволяет динамическому созданию сообщений фиксации для применения соглашений об именовании, таких как использование назначенных префиксов (например, подвиг: для функций или исправлений: для исправлений ошибок).

Например, следующий скрипт prepare-commit-msg автоматически добавляет имя текущей ветви к сообщению фиксации при создании новой фиксации. Он изменяет файл сообщения фиксации ($1), добавив имя ветви, за которым следует двоеточие и пробел в начале файла.

#!C:/Program\ Files/Git/usr/bin/sh.exe
# Get the current branch name
branch_name=$(git branch --show-current)
# Check if the commit message file exists
if [[ -f "$1" ]]; then
  # Prepend the branch name to the commit message
  sed -i "1s/^/$branch_name: /" "$1"
fi

Скрипты после фиксации выполняются после завершения фиксации. Его можно использовать для активации уведомлений или создания документации.

Например, следующий скрипт отправляет уведомление по электронной почте назначенному получателю после каждой фиксации. Скрипт можно настроить, изменив адрес электронной почты получателя, SMTP-сервер и тему и текст сообщения электронной почты. Кроме того, может потребоваться настроить систему для отправки сообщений электронной почты с помощью командлета Send-MailMessage PowerShell или использовать другой метод для отправки уведомлений в зависимости от среды и требований.

#!C:/Program\ Files/Git/usr/bin/sh.exe
# Set the recipient email address
$recipient="your@email.com"
# Set the subject of the email
$subject="Git Commit Notification"
# Set the body of the email
$body="A new commit has been made to the repository."
# Send the email notification
Send-MailMessage -To $recipient -Subject $subject -Body $body -SmtpServer "your.smtp.server"

Стоит отметить, что папка репозитория .git\hooks не фиксируется в системе управления версиями. Вы можете задаться вопросом, есть ли способ поделиться скриптами, разработанными с другими членами вашей команды разработки. Хорошая новость заключается в том, что начиная с версии 2.9 Git можно сопоставить перехватчики Git с папкой, которая может быть зафиксирована в системе управления версиями. Это можно сделать, обновив конфигурацию глобальных параметров для репозитория Git:

Git config --global core.hooksPath '~/.githooks'

Если вам потребуется переписать обработчики Git, настроенные на стороне клиента, можно воспользоваться параметром no-verify:

Git commit --no-verify

Серверные перехватчики

Хотя клиентские перехватчики Git предлагают надежные возможности для улучшения рабочего процесса разработки, Azure Repos также предоставляет серверные перехватчики для дальнейшего расширения процесса разработки, включая поддержку создания запросов на вытягивание. Дополнительные сведения см. в справочнике по событиям перехватчиков службы Azure Repos.