钩子在git目录或hooks目录中运行吗?

时间:2016-01-19 20:19:31

标签: git bash

我正在编写一个看起来像这样的post-receive挂钩:

    #!/bin/sh
    # this file is in root.git/hooks

    # deprecated
    # git --work-tree=~/public_html --git-dir=~/root.git checkout -f

    cd /home/username/www
    git add -A .
    git commit -m "automated commit on push"
    # cd /home/username/root.git/hooks
    # cd /home/username/root.git

    #git pull x
    #git push y

我更改为add / commit的git repo,我需要回到我的裸仓库并执行pull / push

我应该回到hooks目录还是只是git目录。

1 个答案:

答案 0 :(得分:2)

  1. 你不会回到任何地方。当进程退出时,忘记了钩子进程的工作目录,所以如果你把它改成什么就完全无关紧要。

  2. 如果要在存储库上运行命令,则应该在工作树中(如果它是非裸的)或者在存储库中(如果它是裸的)。您之前的位置不相关。

  3. 钩子在该目录中运行,您可以直接在其上发出命令。

  4. 如果您需要暂时去某个地方,我建议您使用子shell:

    (
        cd /home/username/www
        git commit -a -m "automated commit on push"
    )
    # You are back wherever you were, before you opened the parenthesis
    

    这使得脚本可以重新定位(尽可能多;它仍然需要到另一个repo的路径)。

  5. 实际上,GIT_DIR也设置在钩子中,如果你想在不同的存储库上工作,除了更改目录之外你还需要取消设置:

    (
        cd /home/username/www
        unset GIT_DIR
        ...
    )
    

    环境将在)之后恢复,就像当前工作目录一样。