Поиск…


Синтаксис

  • .git / крючки / applypatch-тзд
  • .git / крючки / фиксации-тзд
  • .git / Крючки / после обновления
  • .git / крючки / предварительно applypatch
  • .git / крючки / предварительной фиксации
  • .git / Крючки / подготовить фиксации-сообщ
  • .git / Крючки / предварительно толчок
  • .git / крючки / предварительно Rebase
  • .git / Крючки / обновление

замечания

--no-verify или -n чтобы пропустить все локальные перехватчики в заданной команде git.
Например: git commit -n

Информация на этой странице была собрана из официальных документов Git и Atlassian .

Commit-сообщ

Этот крючок похож на hook prepare-commit-msg , но он вызывается после того, как пользователь вводит сообщение фиксации, а не раньше. Обычно это используется для предупреждения разработчиков, если их сообщение о фиксации находится в неправильном формате.

Единственным аргументом, переданным этому крюку, является имя файла, содержащего это сообщение. Если вам не нравится сообщение, введенное пользователем, вы можете либо изменить этот файл на месте (то же самое, что и prepare-commit-msg ), либо полностью прервать фиксацию, выйдя с ненулевым статусом.

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

word="ticket [0-9]"
isPresent=$(grep -Eoh "$word" $1)

if [[ -z $isPresent ]]
  then echo "Commit message KO, $word is missing"; exit 1;
  else echo "Commit message OK"; exit 0;
fi

Локальные крючки

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

Существует шесть типов локальных перехватов: pre-commit, prepare-commit-msg, commit-msg, post-commit, post-checkout и pre-rebase.

Первые четыре крючка относятся к фиксации и позволяют вам контролировать некоторый элемент в жизненном цикле фиксации. Последние два позволяют выполнять некоторые дополнительные действия или проверки безопасности для команд git checkout и git rebase.

Все «предварительные» крючки позволяют вам изменить действие, которое должно произойти, в то время как «post-» hooks используются в основном для уведомлений.

Пост-контроль

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

Этот крючок принимает три параметра:

  1. ссылка предыдущей главы,
  2. рефери нового HEAD и
  3. флаг, указывающий, была ли это проверка филиала или проверка файла ( 1 или 0 , соответственно).

Его статус выхода не влияет на команду git checkout .

После совершения

Этот крючок вызывается сразу после крючка commit-msg . Он не может изменить результат операции git commit , поэтому он используется в основном для целей уведомления.

Сценарий не принимает никаких параметров, и его статус выхода никак не влияет на фиксацию.

После приема

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

Сценарий не принимает никаких параметров, но отправляется такая же информация, как и pre-receive через стандартный ввод:

<old-value> <new-value> <ref-name>

Предварительно совершить

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

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

Никакие аргументы не передаются в сценарий предварительной фиксации, а выход с ненулевым статусом прерывает всю фиксацию.

Приготовьте фиксации-сообщ

Этот крючок вызывается после крючка pre-commit для заполнения текстового редактора сообщением фиксации. Обычно это используется для изменения автоматически генерируемых сообщений фиксации для раздавленных или объединенных коммитов.

От одного до трех аргументов передается этот крючок:

  • Имя временного файла, содержащего сообщение.
  • Тип фиксации, либо
    • сообщение ( -m или -F ),
    • шаблон (опция -t ),
    • merge (если это слияние), или
    • сквош (если он сжимает другие коммиты).
  • SHA1 хеш соответствующего коммита. Это дается только в том случае, если --amend опция -c , -C или --amend .

Подобно pre-commit , выход с ненулевым статусом прерывает фиксацию.

Pre-перебазироваться

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

Этот крючок принимает 2 параметра:

  1. ветвь вверх по течению, из которой серия была раздвоена, и
  2. ветвь переустанавливается (пустая при перезагрузке текущей ветви).

Вы можете прервать операцию переадресации, выйдя с ненулевым статусом.

Предварительно получить

Этот крючок выполняется каждый раз, когда кто-то использует git push для толкания коммитов в репозиторий. Он всегда находится в удаленном репозитории, который является местом назначения push, а не в исходном (локальном) репозитории.

Захват выполняется до того, как будут обновлены ссылки. Он обычно используется для обеспечения любого вида политики развития.

Скрипт не принимает никаких параметров, но каждый возвращаемый ref передается сценарию в отдельной строке на стандартном входе в следующем формате:

<old-value> <new-value> <ref-name>

Обновить

Этот крюк вызывается после pre-receive , и он работает одинаково. Он вызывается до того, как что-то действительно обновляется, но вызывается отдельно для каждого ref, который был нажат, а не только для всех ссылок.

Этот крючок принимает следующие 3 аргумента:

  • имя обновляемого ref,
  • старое имя объекта, сохраненное в ref, и
  • новое имя объекта, сохраненное в ref.

Это та же самая информация, которая была передана для pre-receive , но поскольку update вызывается отдельно для каждого ref, вы можете отклонить некоторые ссылки, разрешая другим.

Предварительное давление

Доступно в Git 1.8.2 и выше.

1,8

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

Предзапутный крюк создается простым созданием файла с именем pre-push под .git/hooks/ и ( getcha alert ), убедившись, что файл является исполняемым: chmod +x ./git/hooks/pre-push .

Вот пример из Ханны Вулф, которая блокирует толчок хозяину:

#!/bin/bash

protected_branch='master'  
current_branch=$(git symbolic-ref HEAD | sed -e 's,.*/\(.*\),\1,')

if [ $protected_branch = $current_branch ]  
then  
    read -p "You're about to push master, is that what you intended? [y|n] " -n 1 -r < /dev/tty
    echo
    if echo $REPLY | grep -E '^[Yy]$' > /dev/null
    then
        exit 0 # push will execute
    fi
    exit 1 # push will not execute
else  
    exit 0 # push will execute
fi  

Вот пример из Volkan Unsal, который гарантирует, что тесты RSpec пройдут, прежде чем разрешить push:

#!/usr/bin/env ruby
require 'pty'
html_path = "rspec_results.html"
begin
  PTY.spawn( "rspec spec --format h > rspec_results.html" ) do |stdin, stdout, pid|
  begin
    stdin.each { |line| print line }
  rescue Errno::EIO
  end
end
rescue PTY::ChildExited
  puts "Child process exit!"
end

# find out if there were any errors  
html = open(html_path).read
examples = html.match(/(\d+) examples/)[0].to_i rescue 0
errors = html.match(/(\d+) errors/)[0].to_i rescue 0
if errors == 0 then
  errors = html.match(/(\d+) failure/)[0].to_i rescue 0
end
pending = html.match(/(\d+) pending/)[0].to_i rescue 0

if errors.zero?
  puts "0 failed! #{examples} run, #{pending} pending"
  # HTML Output when tests ran successfully:
  # puts "View spec results at #{File.expand_path(html_path)}"
  sleep 1
  exit 0
else
  puts "\aCOMMIT FAILED!!"
  puts "View your rspec results at #{File.expand_path(html_path)}"
  puts
  puts "#{errors} failed! #{examples} run, #{pending} pending"
  # Open HTML Ooutput when tests failed
  # `open #{html_path}`
  exit 1
end

Как вы можете видеть, есть много возможностей, но основная часть - exit 0 если что-то случилось, и exit 1 если что-то случилось. Каждый раз, когда вы exit 1 нажатие будет предотвращено, и ваш код будет находиться в состоянии, которое было до запуска git push...

При использовании крючков на стороне клиента имейте в виду, что пользователи могут пропустить все клики на стороне клиента, используя опцию «--no-verify» при нажатии. Если вы полагаетесь на крючок для принудительного выполнения процесса, вы можете получить ожог.

Документация: https://git-scm.com/docs/githooks#_pre_push
Официальный образец: https://github.com/git/git/blob/87c86dd14abe8db7d00b0df5661ef8cf147a72a3/templates/hooks--pre-push.sample

Проверьте сборку Maven (или другую систему сборки) перед фиксацией

.git/hooks/pre-commit

#!/bin/sh
if [ -s pom.xml ]; then
    echo "Running mvn verify"
    mvn clean verify
    if [ $? -ne 0 ]; then
        echo "Maven build failed"
        exit 1
    fi
fi

Автоматически пересылать определенные нажатия на другие репозитории

post-receive hooks могут использоваться для автоматической пересылки входящих нажатий в другой репозиторий.

$ cat .git/hooks/post-receive

#!/bin/bash

IFS=' '
while read local_ref local_sha remote_ref remote_sha
do

  echo "$remote_ref" | egrep '^refs\/heads\/[A-Z]+-[0-9]+$' >/dev/null && {
    ref=`echo $remote_ref | sed -e 's/^refs\/heads\///'`
    echo Forwarding feature branch to other repository: $ref
    git push -q --force other_repos $ref
  }

done

В этом примере egrep regexp ищет определенный формат ветвления (здесь: JIRA-12345, используемый для обозначения проблем Jira). Вы можете оставить эту часть, если хотите переправить все ветки, конечно.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow