使用Git自动部署-无法运行post接收挂钩

使用Git自动部署-无法运行post接收挂钩,git,ubuntu,vps,githooks,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 然后: 现在,从本地到远程的推送工作正常,我知道这一点,因为我可以在中看到我的本地分支 /var/repo/myrepo.git/refs/heads 但问题是挂钩不起作用 如果我从终端运行:

我已经在/var/repo/myrepo.git中使用

git init --bare
以及一个内部带有以下部件的立柱:

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

现在,从本地到远程的推送工作正常,我知道这一点,因为我可以在中看到我的本地分支

/var/repo/myrepo.git/refs/heads
但问题是挂钩不起作用

如果我从终端运行:

git --work-tree=/var/www/domain.com --git-dir=/var/repo/myrepo.git checkout -f
repo中的所有文件都复制到/var/www/domain.com

那么,如果从bash执行,为什么钩子不起作用,而内部的命令起作用呢

更新_1


正如所建议的,我使用的inside/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 dir中的所有repo文件,但文件“/tmp/mylogfile”为空。

您可以尝试通过将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
为空,则脚本根本不运行,或者它将包含一条有用的错误消息。

如果钩子/post接收不起作用,并且您已将文件正确设置为可执行文件,并且您看到以下消息:

Everything up-to-date
remote: fatal: You are on a branch yet to be born
这可能是因为在你的推动中没有新的变化。因此,更改文件并提交,然后再次推送

如果您看到此消息:

Everything up-to-date
remote: fatal: You are on a branch yet to be born
您可以先推主分支,然后再推所需分支来解决此问题:

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


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

我将钩子命名为
post-receive
,而不是
post-receive
。当我重新命名文件时,我的钩子工作得很好


课程:拼写很重要

是不是
git
在终端的
$PATH
中,但在钩子运行时不在?老实说,我不知道…我怎么能检查?我已经在你的
post-receive
hook中安装了带有“apt-get-install”的git,做一个
echo$PATH>/tmp/mypath&&type-git>/tmp/mypath
。如果已知
git
命令,
键入git
将打印出路径。如果命令未知,
键入git
将打印错误。执行一次git推送,然后检查
/tmp/mypath
的内容。如果文件丢失,则说明钩子根本没有运行。试试在你的普通终端上打印出的git类型。我已经按照你的建议做了,但是“ls-l/tmp”返回0个文件。。。terminale上的“typegit”返回“/usr/bin/git”您的钩子未运行。这就是为什么没有文件。可能会给您一些有用的提示我已经尝试了您的建议,但没有在/tmp下创建任何文件。我知道脚本没有运行,但我不知道为什么,因为我已经完成了(chmod+x post-receive),钩子文件在哪里?你能给出完整的路径吗?“/var/repo/myrepo.git/hooks/post-receive”。我使用“admin”用户从sourcetree推送(无错误):ssh://admin@mydomain.com/var/repo/myrepo.git;“admin”用户是repo和工作目录的所有者。