后接收挂钩失败 - 任何机会看到原因?

时间:2013-11-12 09:07:14

标签: git githooks

我正在实施this方法向我的网站发送更新:

创建了裸仓库以推送到

$ mkdir website.git && cd website.git
$ git init --bare

并添加了以下钩子:

$ mkdir /var/www/example.com
$ cat > hooks/post-receive
#!/bin/sh
GIT_WORK_TREE=/var/www/example.com git checkout -f
$ chmod +x hooks/post-receive

当我从本地存储库推送到website.git时,更新工作正常。但是/var/www/example.com中没有添加任何文件。我怎样才能调查这里可能出现的问题?任何类型的日志或东西?

编辑----------------------

如果我推送到master上的repoRemote分支,而不是demo,问题就解决了。为什么会这样?

6 个答案:

答案 0 :(得分:3)

编辑,2016年12月:人们仍然找到这个旧的答案,现在,3年后,我真正理解真正的问题是什么。使用post-receive挂钩部署多个不同的分支时会发生此问题。如果您只从裸存储库部署一个分支,那么问题就会减少。 Git不断发展,自动部署多个分支的“最佳”解决方案可能会有所不同,具体取决于您拥有的Git版本。另请参阅Git post-receive deployment stops working at random points

(原帖在线下。)


我发现git checkout -f总是需要一个分支名称;允许它在裸存储库中使用HEAD是不可预测的。

你也可能遇到索引问题(git会在裸仓库中写一个,但有时会混淆)。它最适合git checkout -f deployment-branch到一个新的,空的目录。 (它应该可以为每个部署分支设置索引文件,我从来没有尝试过这个。)

如果您的裸仓库在其他分支上比在用于部署的分支上相当活跃,那么最好用更高级的shell脚本来包装代码,以检查相关的部署分支是否实际已被更改。也就是说,如果有人更新web-devel,那么重新重新部署deployment-branch是没有意义的,这次他们 这次更新了。

答案 1 :(得分:1)

在Git 2.13(2017年第二季度)中确定并修复了收件后挂钩问题的另一个可能原因:如果readline()设置为无效路径。

commit ce83eadcommit aac3eaaJohannes Schindelin (dscho)(2017年3月8日) Junio C Hamano -- gitster --于2017年3月13日commit ba37c92合并)

示例(仅与Git 2.12崩溃)

GIT_WORK_TREE

错误是introduced in Git 2.12

答案 2 :(得分:1)

从上面关于针对特定分支的可靠性的评论中-我发现了从接收后挂钩针对主分支的要点。

#!/bin/bash 
set -eu

TARGET="/deployment-location-here"
GIT_DIR="/trigger-location-here"
BRANCH="master"

while read oldrev newrev ref
do
        # only checking out the master (or whatever branch you would like to deploy)
        if [[ $ref = refs/heads/"$BRANCH" ]];
        then
                echo "Ref $ref received. Deploying ${BRANCH} branch to production..."
                git --work-tree="$TARGET" --git-dir="$GIT_DIR" checkout -f
        else
                echo "Ref $ref received. Doing nothing: only the ${BRANCH} branch may be deployed on this server."
        fi
done

答案 3 :(得分:0)

cd .git/hooks
mv post-receive post-receive-inner

现在创建一个新的post-receive

#!/bin/bash
set -x
./post-receive-inner "$@" 1>/tmp/git.log 2>&1 

制作此可执行文件并重试,结果应最终显示在/tmp/git.log

答案 4 :(得分:0)

我在我的网站上这样做:

#!/bin/sh
unset $(git rev-parse --local-env-vars)
cd /var/www/example.com
git pull

答案 5 :(得分:0)

使脚本可执行:

chmod +x .git/hooks/post-receive