我使用/var/repo/myrepo.git 创建了一个存储库
git init --bare
以及一个带有内部的 post-receive 钩子(Hook):
#!/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
但问题是钩子(Hook)不起作用。
然后如果我从终端运行:
git --work-tree=/var/www/domain.com --git-dir=/var/repo/myrepo.git checkout -f
存储库中的所有文件都复制到/var/www/domain.com
那么为什么钩子(Hook)不起作用,但如果从 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
这将按预期复制我的警告目录中的所有存储库文件,但文件“/tmp/mylogfile”是空的。
最佳答案
如果 hooks/post-receive 不起作用,并且您已将文件正确设置为可执行文件,并且您会看到以下消息:
Everything up-to-date
可能是因为您的推送没有新的变化。因此,更改文件并提交并再次推送。
如果您看到此消息:
remote: fatal: You are on a branch yet to be born
您可以通过先推送主分支,然后再推送所需的分支来解决此问题:
git push serverRemote master
此后,工作树目录中的文件将成为主分支文件。如果您想在每次推送后使用所需的分支文件更新文件,则必须从服务器中的裸存储库 check out 所需的分支(您必须在命令中输入工作树目录):
git --work-tree=/path/to/work/tree checkout yourDesiredBranch
关于git - 使用 Git 自动部署 - 无法运行接收后 Hook ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32693239/