我使用
在/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”为空。
答案 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