代码之家  ›  专栏  ›  技术社区  ›  Silas Snider

Git post接收挂钩不工作

  •  12
  • Silas Snider  · 技术社区  · 16 年前

    因此,在~git/I中有一个目录,我们称之为“a”,其中包含git repo的克隆。post-receive钩子看起来像:

    #!/bin/bash
    cd ~git/repositories/a.git
    . ~git/post-receive-email &> /dev/null
    ( cd ~git/a && git pull &> ~git/pull_log.log && php ~git/a/scripts/generate_markdown_documentation.php &> ~git/doc_log.log )
    

    电子邮件脚本正在工作,但文档生成没有工作。pull\ u log.log的内容是:

    fatal: Not a git repository: '.'
    

    这使我认为它没有更改到上面脚本第5行中的正确目录。我错了吗?我怎样才能让它工作?

    我已经按照回复中的建议更新了post-receive-hook。脚本现在是:

    #!/bin/bash
    function die {
      echo "$*" >&2; exit 1
    }
    
    function checkgit {
      [ -d "$1/.git" ] || die "$1 could not possibly be a git repo; $1/.git is not a dir"
    }
    
    
    cd ~git/repositories/a.git
    . ~git/post-receive-email &> /dev/null
    ( set -x
    checkgit ~git/a
    cd ~git/a
    checkgit .
    pwd
    git pull
    php ~git/a/scripts/generate_markdown_documentation.php )
    

    我从git push得到以下输出:

    + checkgit /var/git/a
    + '[' -d /var/git/a/.git ']'
    + cd /var/git/a
    + checkgit .
    + '[' -d ./.git ']'
    + pwd
    /var/git/a
    + git pull
    fatal: Not a git repository: '.'
    + php /var/git/a/scripts/generate_markdown_documentation.php
    

    还有什么帮助吗?

    哦,如果我自己运行这个脚本,它就可以运行了(我通过hooks/post-receive来运行)

    发现了问题,多亏了 serverfault --基本上,环境变量 GIT_DIR 和 GIT_WORK_TREE

    3 回复  |  直到 9 年前
        1
  •  3
  •   Norman Ramsey    16 年前

    function die {
      echo "$*" >&2; exit 1
    }
    
    function checkgit {
      [ -d "$1/.git" ] || die "$1 could not possibly be a git repo; $1/.git is not a dir"
    }
    

    set -x # show exactly what's executed (writes to stderr)
    checkgit ~git/a
    cd ~git/a && checkgit . && git pull ...
    

    您还可以考虑重定向子shell的整个STDRR,例如,

    ( ... ) 2>/tmp/mydiagnosis$$.log
    

    (这是临时措施,只有在日志中没有机密信息时才可以。)


    git 傅,但还有一些事情要尝试:

    1. ~git/a 看看你能不能来 git pull 手工这应该失败。
    2. 进入 ~吉特/a 然后跑 git status . 这也应该失败。如果没有,那么 吉特 给你一个非常糟糕的错误信息。

    如果两个步骤都失败了, ~吉特/a

    如果第一步是手工完成的,那么奇怪的事情就发生了,我很困惑。

    如果第一步失败,但第二步成功,则分支可能有问题:

    • 设置为错误的分支,并且您的回购需要一个它没有的分支。尝试 git branch -a

    • 也许您有分支,但它没有与远程存储库正确关联。在这一点上,你必须潜入 ~git/a/.git/config 真实的 git专家;我只是在电视上玩一个。

        2
  •  0
  •   TheDeadSerious    15 年前

    我最近遇到了一个类似的问题,我认为这与git设置的环境变量有关,特别是$git\u DIR变量。如果您设置了这个集合,那么其他repos上的所有git命令都会开始表现出奇怪的行为。基本上,我认为在钩子中运行git pull必须在一个中立的shell环境中调用,这个环境没有那些奇怪的变量,并且会导致git混乱,尽管我还没有弄清楚如何做到这一点。

        3
  •  0
  •   Community Mohan Dere    9 年前

    unset GIT_DIR 是一个解决方案,可以解决您看到的致命错误。

    看见 https://stackoverflow.com/a/4100577