49

在 Git 中签出新分支后,有没有办法触发挂钩?

4

4 回答 4

52

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`

注意:第一行的 shebang 表示脚本的类型。

这个脚本(git hook)只会捕获传递的三个参数,并以人性化的格式打印出来。

于 2014-01-02T22:18:21.423 回答
40

如果这些钩子中的一个不能做到这一点,我会感到惊讶:

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

也许这个

结帐后

在更新工作树后运行 git-checkout 时会调用此挂钩。钩子被赋予了三个参数:前一个 HEAD 的 ref,新 HEAD 的 ref(可能已经改变也可能没有改变),以及一个指示检出是否是分支检出的标志(改变分支,标志 = 1)或文件检出(从索引中检索文件,标志=0)。这个钩子不会影响 git-checkout 的结果。

于 2009-06-18T09:33:55.253 回答
11

与其他类似,但验证分支已被检出一次。

#!/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
于 2016-02-03T16:09:55.197 回答
8

post-checkout 钩子接收三个参数:

  1. 前 HEAD 的参考
  2. 新 HEAD 的参考
  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 位于同一个 HEAD 的现有分支会欺骗它。
  • 不会检测到不是从当前 HEAD创建新分支。
于 2016-01-22T00:26:08.980 回答