使用Git自动部署 - 无法运行post-receive hooks

时间:2015-09-21 10:44:13

标签: git ubuntu vps githooks

我使用

在/var/repo/myrepo.git中创建了一个存储库
git init --bare

和内部的接收后挂钩:

#!/bin/sh
git --work-tree=/var/www/domain.com --git-dir=/var/repo/myrepo.git checkout -f

然后:

chmod +x post-receive

现在,从本地推送到远程工作正常,我知道因为我可以在

中看到我的本地分支
/var/repo/myrepo.git/refs/heads

但问题是钩子不起作用。

然后如果我从终端运行:

git --work-tree=/var/www/domain.com --git-dir=/var/repo/myrepo.git checkout -f

将来自回购的所有文件复制到/var/www/domain.com

那么为什么钩子不起作用,但是如果从bash执行,那么命令里面的命令呢?

UPDATE_1

根据建议,在 /var/repo/myrepo.git/hooks/post-receive 里面我正在使用:

git --work-tree=/var/www/domain.com --git-dir=/var/repo/myrepo.git checkout -f >/tmp/mylogfile 2>/tmp/mylogfile

该文件是可执行的,因为我可以运行它:

./post-receive

按照预期复制我的warking目录中的所有repo文件,但文件“/ tmp / mylogfile”为空。

3 个答案:

答案 0 :(得分:1)

您可以尝试通过将stdout和stderr输出到文件来调试脚本

#!/bin/sh
git --work-tree=/var/www/domain.com --git-dir=/var/repo/myrepo.git checkout -f >/tmp/mylogfile 2>/tmp/mylogfile

如果在运行此挂钩后/tmp/mylogfile为空,则根本不运行脚本,或者它将包含有用的错误消息。

答案 1 :(得分:1)

我遇到了与OP相同的问题,并且意识到这个答案是我的解决方案:

https://stackoverflow.com/a/32337074/2100999

我将钩子命名为post-receive,而不是post-receieve。重命名文件后,钩子可以正常工作。

课程:拼写很重要!

答案 2 :(得分:0)

如果hooks / post-receive不起作用,并且您已将文件正确设置为可执行文件,则会看到以下消息:

Everything up-to-date

可能是因为您的推送没有新的变化。因此,更改文件并提交并再次推送。

如果您看到此消息:

remote: fatal: You are on a branch yet to be born

您可以通过先推动主分支再推动所需的分支来解决此问题:

git push serverRemote master

在此之后,单词树目录中的文件将成为主分支文件。如果要在每次推送后使用所需的分支文件更新文件,则必须从服务器中的裸存储库检出所需的分支(必须在命令中输入工作树目录):

git --work-tree=/path/to/work/tree checkout yourDesiredBranch