我正在实施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
,问题就解决了。为什么会这样?
答案 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 ce83ead见commit aac3eaa,Johannes Schindelin (dscho
)(2017年3月8日)
(Junio C Hamano -- gitster
--于2017年3月13日commit ba37c92合并)
示例(仅与Git 2.12崩溃)
GIT_WORK_TREE
答案 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