Есть ли способ вызвать хук после того, как новая ветка была проверена в Git? - PullRequest
31 голосов
/ 18 июня 2009

Есть ли способ вызвать хук после того, как новая ветка была проверена в Git?

Ответы [ 4 ]

35 голосов
/ 03 января 2014

Git hook - это скрипт, размещенный в специальном месте вашего репозитория, это местоположение:

.git / Крючки

Сценарий может быть любого типа, который вы можете выполнить в вашей среде, например, bash, python, ruby ​​и т. Д.

Хук, который выполняется после оформления заказа, - post-checkout . Из документов:

... Крюку задаются три параметра ...

Пример:

  1. Создать хук (скрипт):

    touch .git/hooks/post-checkout
    chmod u+x .git/hooks/post-checkout
    
  2. Содержание образца крючка:

#!/bin/bash                                                                      

set -e                                                                           

printf '\npost-checkout hook\n\n'                                                

prevHEAD=$1                                                                      
newHEAD=$2                                                                       
checkoutType=$3                                                                  

[[ $checkoutType == 1 ]] && checkoutType='branch' ||                             
                            checkoutType='file' ;                                

echo 'Checkout type: '$checkoutType                                              
echo '    prev HEAD: '`git name-rev --name-only $prevHEAD`                       
echo '     new HEAD: '`git name-rev --name-only $newHEAD`

Примечание. Шебанг в первой строке указывает тип сценария.

Этот скрипт (git hook) будет захватывать только три переданных параметра и печатать их в удобном для человека формате.

32 голосов
/ 18 июня 2009

Если один из этих крючков этого не сделает, я удивлюсь:

https://schacon.github.io/git/githooks.html

Может быть этот :

после кассового

Этот хук вызывается, когда Git-Checkout запускается после того, как обновил рабочее дерево. Крючок даны три параметра: ссылка на предыдущая голова, ссылка на новую голову (которые могли или не могли измениться), и флаг, указывающий, является ли оформить заказ (смена ветки, флаг = 1) или файл извлечение (получение файла из index, flag = 0). Этот крюк не может влияет на исход git-checkout.

7 голосов
/ 03 февраля 2016

Аналогично другим, но проверяет, что ветвь была проверена один раз.

#!/bin/bash

# this is a file checkout – do nothing
if [ "$3" == "0" ]; then exit; fi

BRANCH_NAME=$(git symbolic-ref --short -q HEAD)
NUM_CHECKOUTS=`git reflog --date=local | grep -o ${BRANCH_NAME} | wc -l`

#if the refs of the previous and new heads are the same 
#AND the number of checkouts equals one, a new branch has been created
if [ "$1" == "$2"  ] && [ ${NUM_CHECKOUTS} -eq 1 ]; then
    git push origin ${BRANCH_NAME}
fi
3 голосов
/ 22 января 2016

Крюк post-checkout получает три параметра:

  1. Ссылка на предыдущую ГОЛОВУ
  2. Ссылка на новую ГОЛОВУ
  3. Будь то проверка файла (0) или проверка ветви (1)

Вы можете использовать тот факт, что ветвь, созданная из текущего HEAD, будет иметь одинаковое значение для параметров 1 и 2.

cat > .git/hooks/post-checkout <<"EOF"
if [ "$3" == "0" ]; then exit; fi
if [ "$1" == "$2" ]; then 
  echo "New branch created. (Probably)."
fi
EOF

chmod u+x .git/hooks/post-checkout

Ограничения:

  • Проверка существующей ветви, которая оказывается в том же заголовке, что и текущий заголовок, обманет его.
  • Создание новой ветви , а не из текущей HEAD, не будет обнаружено.
...