Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Git中签出一个新分支后,有没有方法触发钩子?_Git_Githooks - Fatal编程技术网

在Git中签出一个新分支后,有没有方法触发钩子?

在Git中签出一个新分支后,有没有方法触发钩子?,git,githooks,Git,Githooks,有没有办法在Git中签出新分支后触发钩子?如果这些钩子中的一个不能触发钩子,我会感到惊讶: 也许: 结账后 当 git签出是在 更新了工作树。钩子是 给定三个参数: 前一个头部,新头部的参考 (可能改变,也可能没有改变), 以及一个标志,指示 结帐是一个分支结帐 (更改分支,标志=1)或文件 签出(从数据库中检索文件) 索引,标志=0)。这个钩子不行 影响git签出的结果 git钩子是放置在存储库特定位置的脚本,该位置是: .git/hooks 脚本可以是您可以在环境中执行的任何类型,即bas

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

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

也许:

结账后

当 git签出是在 更新了工作树。钩子是 给定三个参数: 前一个头部,新头部的参考 (可能改变,也可能没有改变), 以及一个标志,指示 结帐是一个分支结帐 (更改分支,标志=1)或文件 签出(从数据库中检索文件) 索引,标志=0)。这个钩子不行 影响git签出的结果


git钩子是放置在存储库特定位置的脚本,该位置是:

.git/hooks

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

签出后执行的钩子是。从文档中:

…吊钩有三个参数

示例:

  • 创建钩子(脚本):

  • 钩子样本内容:

  • #/bin/bash
    set-e
    printf'\n后台签出钩子\n\n'
    prevHEAD=$1
    newHEAD=$2
    签出类型=$3
    [[$checkoutType==1]]&&checkoutType='branch'||
    checkoutType='file';
    回显“签出类型:”$checkoutType
    echo“prev HEAD:”`git name rev--name only$prevHEAD`
    echo'newHEAD:''git name rev--name only$newHEAD`
    
    注意:第一行的shebang表示脚本的类型


    此脚本(git hook)将仅捕获传递的三个参数,并以人性化的格式打印它们。

    签出后
    接收三个参数:

  • 前一标题的参考号
  • 新总目编号
  • 这是文件签出(
    0
    )还是分支签出(
    1
  • 您可以使用这样一个事实,即从当前标头创建的分支对于参数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
    

    cat>.git/hooks/post checkout与其他类似,但验证分支是否已签出一次

    #!/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
    

    你知道有什么方法可以判断这是否是分支创建签出(除了查看新主管的reflog之外)?似乎你最好问一个全新的问题。如果你愿意,把链接发给我,我会看看是否能帮上忙。您试图解决的问题是什么?如果提交是几个分支的顶部,
    name rev
    只给出按字母顺序排列的名称。因此,在签出名称按字母顺序位于原始分支名称之前的分支后,
    prev HEAD
    行将给出新分支的名称。解决方法:
    thisBranchName=$(git rev parse--abbrev ref HEAD);对于$中的分支(git branch--color=never--包含$1 | sed-e's/^../');如果[“$(git show ref-s$branch)”==1]&&&[“$branch”!=“$thisBranchName”];然后parentBranchName=$branch;打破fi;完成
    谢谢,
    chmod u+x.git/hooks/post checkout
    部分让我走上了正确的道路,非常感谢!由于这是一个grepping reflog来计数签出,我相信一个问题是,如果以前存在一个分支,并且创建了一个同名的新分支,那么该分支将不会被识别为新分支。这可能是期望的行为,也可能是一个问题,这取决于用例,但我只是想提一下。请注意,
    post-checkout
    hook也适用于
    git-switch
    ,而没有
    post-switch
    hook(从git 2.25开始)。
    #!/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