我正在实现this向我的网站发送更新的方法:
创建了裸存储库以推送到
$ mkdir website.git && cd website.git
$ git init --bare
并添加了以下钩子(Hook):
$ 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
中。我怎样才能调查这里可能出了什么问题?任何类型的日志或其他什么?
编辑----------------------
如果我推送到 repoRemote
上的 master
分支(而不是 demo
),问题就得到解决。为什么会这样?
最佳答案
编辑,2016 年 12 月:人们仍在寻找这个旧答案,三年后的现在,我真正明白真正的问题是什么。当您使用 post-receive Hook 部署多个不同分支时,就会出现此问题。如果您只从裸存储库部署一个分支,那么遇到的问题就会更少。 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
,而他们没有更新了该内容这次。
关于git - 接收后 Hook 失败 - 有机会了解原因吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19924981/