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

Rob*_*son 37 git githooks

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

giv*_*nse 39

git hook是放置在存储库的特殊位置的脚本,该位置是:

的.git /钩

脚本可以是您可以在您的环境中执行的任何类型,例如bash,python,ruby等.

结账执行的挂钩是结账.来自文档:

......钩子有三个参数......

例:

  1. 创建钩子(脚本):

    touch .git/hooks/post-checkout
    chmod u+x .git/hooks/post-checkout
    
    Run Code Online (Sandbox Code Playgroud)
  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`
Run Code Online (Sandbox Code Playgroud)

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

这个脚本(git hook)只捕获传递的三个参数,并以人性化的格式打印它们.

  • 您知道有什么方法可以判断这是否是分支创建结帐(除了查看新 HEAD 的 reflog)? (2认同)
  • 小心 [`cond && opt1 || opt2`](/sf/ask/276755181/#comment73915813_3953666) (2认同)

Spl*_*iFF 33

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

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

也许这一个:

后结账

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

  • 请注意,“post-checkout”挂钩也适用于“git switch”,但没有“post-switch”挂钩(从 gi​​t 2.25 开始)。 (4认同)

Jus*_*son 8

与其他人类似,但验证分支已经签出一次.

#!/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
Run Code Online (Sandbox Code Playgroud)

  • 这让我走上了正确的道路,非常感谢!由于它正在使用reflog来计算结帐,我相信如果之前存在一个分支并且创建了一个具有相同名称的新分支,那么该分支将不会被识别为新分支.根据用例,这可能是期望的行为或问题,但我只是想我会提到它. (2认同)

Ste*_*ett 7

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
Run Code Online (Sandbox Code Playgroud)

限制:

  • 检查与当前 HEAD 位于同一 HEAD 的现有分支将愚弄它。
  • 不会检测到不是从当前 HEAD创建的新分支。