5 Простых Git Хуков для Управления Вашим Репозиторием

Git — это блестящий инструмент. Он позволяет вам не только отслеживать изменения в файле с помощью хуков, но и бесшовно сотрудничать с другими людьми. В этом отношении Git — это инструмент, который продвинул развитие FOSS вперед.
Тем не менее, одной из самых больших проблем с Git является то, что управление вашими репозиториями требует времени и усилий. Например, коммит и синхронизация этих репозиториев могут занять два-три git-команды. Это делает управление ими не только утомительным, но и подверженным пользовательским ошибкам. Здесь мы покажем вам несколько простых, но эффективных Git хуков для лучшего управления вашими репозиториями.
Примечание: вы также можете управлять Git в Emacs. Узнайте как!
Содержание
- Что такое Git хуки?
- Предотвращение пуша в мастер
- Отклонение пушей в ветку мастер
- Блокировка репозитория от ребейса
- Принудительная проверка стиля и синтаксиса вашего кода
- Автоматическое уведомление пользователей об изменениях в репозитории
- Часто задаваемые вопросы
Что такое Git хуки?
В своей основе git-hook — это гибкая подкоманда, которую вы можете использовать для создания пользовательских скриптов, которые выполняются каждый раз, когда Git выполняет действие в репозитории. Например, возможно использовать хук для автоматической проверки вашего репозитория на наличие ошибок стиля перед тем, как вы даже сделаете коммит.

Подкоманда hook работает, читая папку “hooks” в директории вашего репозитория “ .git”. Эта папка содержит ряд заранее подготовленных файлов, которые предоставляют пример скрипта для каждого действия в Git, которое вы можете автоматизировать.

В большинстве случаев вы можете написать git hook на любом языке сценариев, который вы хотите. Это делает его невероятно гибким и доступным для любого разработчика программного обеспечения.
Совет: чтобы начать работать с Git, вам сначала нужно настроить имя пользователя и адрес электронной почты Git. Узнайте как в этом руководстве.
1. Предотвращение пуша в мастер
Одна из самых распространенных ошибок, которую делает пользователь в Git, — это пуш коммита из ветки разработки напрямую в мастер. Это может быть невероятно разочаровывающим, если вы используете Github для отслеживания и поддержки ваших проектов.

Вы можете предотвратить эту проблему, создав Git хук “pre-push”, который будет проверять и подтверждать, когда вы пытаетесь запушить репозиторий из ветки мастер.
- Перейдите в Git репозиторий, который вы хотите защитить.

- Создайте файл Git хука с вашим скриптом проверки. Поскольку это хук, который должен выполняться перед “push”, вам нужно создать файл хука “pre-push”:
touch .git/hooks/pre-push- Откройте ваш новый файл хука в текстовом редакторе.
nano .git/hooks/pre-push- Внутри напишите ваш новый хук “pre-push”. Например, следующий скрипт будет запрашивать ваше подтверждение, когда вы пушите из ветки мастер:
#!/bin/sh
protect='master'
current=$(git symbolic-ref HEAD |sed-e's,.*/\(.*\),\1,')
if[$protect = $current]
then
read-p"Подтвердите пуш в мастер? Y/n."-n1-r/dev/null
then
exit0
fi
exit1
else
exit0
fi- Сохраните ваш новый хук. В nano сделайте это, нажав Ctrl + O, затем Ctrl + X.

- Выполните следующую команду, чтобы убедиться, что Git может выполнить ваш новый хук.
chmod +x .git/hooks/pre-push2. Отклонение пушей в ветку мастер
Помимо предотвращения пуша в мастер, вы также можете создать серверный хук, который будет отклонять любые пуши в его ветку мастер. Это невероятно полезно, если вы делитесь репозиторием с несколькими разработчиками.

Исправьте это, создав хук “pre-receive”, который автоматически предотвратит любого ограниченного пользователя от пуша в ветку мастер.
- Создайте файл Git хука “pre-receive” в вашем удаленном репозитории.
touch .git/hooks/pre-receive- Откройте этот файл.
nano .git/hooks/pre-receive- Добавьте скрипт отклонения в ваш хук “pre-receive”. Например, следующие строки кода должны работать сразу:
#!/bin/sh
branch=$(git symbolic-ref HEAD |sed-e's,.*/\(.*\),\1,')
blacklist=(alice bob)
if[[${blacklist[*]} =~ $USER]]; then
if["$branch" == "master"]; then
echo"Вам не разрешено вносить изменения в эту ветку"
exit1
fi
fiСохраните ваш новый файл хука. В моем случае мне нужно нажать Ctrl + O, затем Ctrl + X, чтобы сохранить файл.
Сохраните ваш скрипт хука и сделайте его исполняемым.
chmod +x .git/hooks/pre-receiveСовет: вы также можете использовать псевдонимы Git, чтобы сделать использование Git более эффективным.
3. Блокировка репозитория от ребейса
Еще одной распространенной ошибкой, которую делает пользователь в Git, является ребейс активной ветки. Это может быть разочаровывающей проблемой, если вы работаете с репозиторием с несколькими участниками, так как ребейс удалит коммиты, которые сделали другие пользователи.

Вы можете предотвратить эту проблему, создав хук “pre-rebase”, который будет проверять, заблокирована ли текущая ветка.
- Создайте файл “pre-rebase” в директории “ .git/hooks”:
touch .git/hooks/pre-rebase- Откройте этот файл для редактирования.
nano .git/hooks/pre-rebase- Добавьте скрипт ребейса в ваш новый файл хука.
#!/bin/sh
branch="$2"
[-n"$branch"]||branch=$(git rev-parse--abbrev-ref HEAD)
lock="branch.${branch}.rebaselock"
if["$(git config --bool "$lock")" = true]; then
echo"pre-rebase hook: \"$lock\" установлен в true. Отказ в ребейсе."
exit1
fi- Сохраните ваш новый файл хука и сделайте его исполняемым.
chmod +x .git/hooks/pre-rebase4. Принудительная проверка стиля и синтаксиса вашего кода
Одним из самых полезных применений Git хука является его связь с линтером кода. Это простая программа, которая проверяет, соответствует ли ваш код стилю и формату проекта.

- Чтобы связать линтер с вашим Git репозиторием, сначала создайте файл хука “pre-commit”.
touch .git/hooks/pre-commit- Установите соответствующий линтер для языка вашего проекта. В этом случае я использую “shellcheck” для анализа моего Bash кода:
sudo apt install shellcheck- Откройте ваш новый файл хука и добавьте следующий скрипт.
#!/bin/bash
forfilein $(git diff--cached--name-only--diff-filter=AM |grep-E'\.sh$')
do
shellcheck "$file"# Запустите линтер для каждого нового файла.
if[$?-ne0]; then
exit1# Завершите коммит, если линтер не прошел.
fi
done- Сохраните ваш новый файл хука и сделайте его исполняемым:
chmod +x .git/hooks/pre-commit5. Автоматическое уведомление пользователей об изменениях в репозитории
Наконец, вы также можете создать Git хук, который автоматически отправит электронное письмо, когда ваш репозиторий получит новый коммит. Это полезно, если вы хотите создать простую систему уведомлений для вашего репозитория.
- Создайте файл хука “post-receive” в директории .git/hooks вашего репозитория:
touch .git/hooks/post-receive- Откройте ваш новый файл Git хука и введите следующий скрипт:
#!/bin/sh
commit_message=$(git log-1--pretty=%B)
users=("[email protected]""[email protected]""[email protected]")
for user in"${users[@]}"; do
mail -s"Новый коммит: $commit_message"$user- Сохраните ваш новый файл хука и сделайте его исполняемым.
chmod +x .git/hooks/post-receiveЧасто задаваемые вопросы
Могу ли я писать свои Git хуки на компилируемом языке, таком как C?
Одним из самых больших ограничений Git хуков является то, что он требует от вас использования языка, который вы можете запустить непосредственно из терминала. Это означает, что Git хуки не поддерживают никакой компилируемый язык для своих скриптов. Например, вы можете создать новый Git хук, используя либо Python, либо Shell, но не C или C++.
Возможно ли запускать несколько хуков в одном Git репозитории?
Да. Хотя приведенные выше примеры показывают хуки как отдельные, дискретные функции, вы можете легко смешивать их вместе, чтобы создать свой уникальный рабочий процесс, что делает Git хуки невероятно гибкими и адаптируемыми для любой ситуации программирования. Например, вы можете использовать как хук “Предотвращение пуша в мастер“ pre-push, так и хук “Проверка синтаксиса” pre-commit в своем собственном репозитории.
Почему хуки электронной почты Git не отправляют электронные письма пользователям?
Эта проблема, скорее всего, связана с тем, что ваш удаленный сервер не может правильно отправить какие-либо исходящие электронные письма. Чтобы исправить это, убедитесь, что ваш удаленный сервер безопасен и что у него есть работающий агент доставки почты вместе с SMTP-доменом.
Image credit: Unsplash. Все изменения и скриншоты Ramces Red.