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

5 Git Hooks 00 Featured Image

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

Тем не менее, одной из самых больших проблем с Git является то, что управление вашими репозиториями требует времени и усилий. Например, коммит и синхронизация этих репозиториев могут занять два-три git-команды. Это делает управление ими не только утомительным, но и подверженным пользовательским ошибкам. Здесь мы покажем вам несколько простых, но эффективных Git хуков для лучшего управления вашими репозиториями.

Примечание: вы также можете управлять Git в Emacs. Узнайте как!

Содержание

  • Что такое Git хуки?
    1. Предотвращение пуша в мастер
    1. Отклонение пушей в ветку мастер
    1. Блокировка репозитория от ребейса
    1. Принудительная проверка стиля и синтаксиса вашего кода
    1. Автоматическое уведомление пользователей об изменениях в репозитории
  • Часто задаваемые вопросы

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

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

5 Git Hooks 02 Example Linter

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

5 Git Hooks 03 Default Hooks Directory

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

Совет: чтобы начать работать с Git, вам сначала нужно настроить имя пользователя и адрес электронной почты Git. Узнайте как в этом руководстве.

1. Предотвращение пуша в мастер

Одна из самых распространенных ошибок, которую делает пользователь в Git, — это пуш коммита из ветки разработки напрямую в мастер. Это может быть невероятно разочаровывающим, если вы используете Github для отслеживания и поддержки ваших проектов.

5 Git Hooks 04 Example Git Push

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

  1. Перейдите в Git репозиторий, который вы хотите защитить.

5 Git Hooks 05 Cd To Repository

  1. Создайте файл Git хука с вашим скриптом проверки. Поскольку это хук, который должен выполняться перед “push”, вам нужно создать файл хука “pre-push”:
touch .git/hooks/pre-push
  1. Откройте ваш новый файл хука в текстовом редакторе.
nano .git/hooks/pre-push
  1. Внутри напишите ваш новый хук “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
  1. Сохраните ваш новый хук. В nano сделайте это, нажав Ctrl + O, затем Ctrl + X.

5 Git Hooks 07 Pre Push Hook Filled

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

2. Отклонение пушей в ветку мастер

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

5 Git Hooks 08 Git Log Sample

Исправьте это, создав хук “pre-receive”, который автоматически предотвратит любого ограниченного пользователя от пуша в ветку мастер.

  1. Создайте файл Git хука “pre-receive” в вашем удаленном репозитории.
touch .git/hooks/pre-receive
  1. Откройте этот файл.
nano .git/hooks/pre-receive
  1. Добавьте скрипт отклонения в ваш хук “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
  1. Сохраните ваш новый файл хука. В моем случае мне нужно нажать Ctrl + O, затем Ctrl + X, чтобы сохранить файл.

  2. Сохраните ваш скрипт хука и сделайте его исполняемым.

chmod +x .git/hooks/pre-receive

Совет: вы также можете использовать псевдонимы Git, чтобы сделать использование Git более эффективным.

3. Блокировка репозитория от ребейса

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

5 Git Hooks 11 Git Rebase Man Page

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

  1. Создайте файл “pre-rebase” в директории “ .git/hooks”:
touch .git/hooks/pre-rebase
  1. Откройте этот файл для редактирования.
nano .git/hooks/pre-rebase
  1. Добавьте скрипт ребейса в ваш новый файл хука.
#!/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
  1. Сохраните ваш новый файл хука и сделайте его исполняемым.
chmod +x .git/hooks/pre-rebase

4. Принудительная проверка стиля и синтаксиса вашего кода

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

5 Git Hooks 14 Shellcheck Man Page

  1. Чтобы связать линтер с вашим Git репозиторием, сначала создайте файл хука “pre-commit”.
touch .git/hooks/pre-commit
  1. Установите соответствующий линтер для языка вашего проекта. В этом случае я использую “shellcheck” для анализа моего Bash кода:
sudo apt install shellcheck
  1. Откройте ваш новый файл хука и добавьте следующий скрипт.
#!/bin/bash  
forfilein $(git diff--cached--name-only--diff-filter=AM |grep-E'\.sh$')  
do  
  
shellcheck "$file"# Запустите линтер для каждого нового файла.  
  
if[$?-ne0]; then  
exit1# Завершите коммит, если линтер не прошел.  
fi  
done
  1. Сохраните ваш новый файл хука и сделайте его исполняемым:
chmod +x .git/hooks/pre-commit

5. Автоматическое уведомление пользователей об изменениях в репозитории

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

  1. Создайте файл хука “post-receive” в директории .git/hooks вашего репозитория:
touch .git/hooks/post-receive
  1. Откройте ваш новый файл 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
  1. Сохраните ваш новый файл хука и сделайте его исполняемым.
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.