我有三个git存储库:
我在裸存储库上设置了一个post-receive,一个服务器端钩子,让存储库(B)从裸机中拉出来,当我提交并从存储库(A)推送到裸机时让git服务器发送通知邮件库。我在裸存储库上创建的post-receive文件如下:
#!/bin/sh
ssh -l MYUSER -i PRIVKEY www.HOSTINGSERVER.com "cd GITDIRECTORY;git pull"
. $(dirname $0)/post-receive-email
我还在裸存储库上设置了环境变量:
git config hooks.mailinglist "MyMailAddress"
git config hooks.announcelist "MyMailAddress"
git config hooks.emailprefix "FooBar"
echo FooBar > description
我预计存储库(B)被拉出,git服务器在我提交并推送到裸存储库时通过post-receive-email发送通知电子邮件,但是post-receive没有像我希望的那样工作。它有存储库(B)拉,但没有git服务器发送任何电子邮件。我没有在git服务器上的日志中看到任何电子邮件错误。
当我评论收到后的ssh部分时,我收到了一封电子邮件。当我注释掉收件后电子邮件部分时,存储库(B)正确拉出。当ssh部分和post-receive-email部分都处于活动状态时,post-receive仅具有存储库(B)pull并且不发送任何电子邮件。
我不知道为什么当ssh部分和post-receive-email部分同时存在时,post-receive无法正常工作。
任何提示和评论表示赞赏。先感谢您。
TL; DR:ssh -n
。
背景事实:
read
效率低下的原因:一次读取输入一个字节是必要的,这样只会消耗read
读取的数量。)考虑到这一点,请考虑ssh
命令,以及其documentation的摘录:
-n从/ dev / null重定向stdin(实际上,阻止从stdin读取)。
那么,如果你在没有ssh
的情况下运行-n
会发生什么?当然,它会读取标准输入。但是......它会读多少钱?好吧,严格来说,这取决于:ssh运行多个进程和/或线程,并且如果存在大量stdin输入并且远程端上运行的命令执行得非常快,则存在竞争,但通常, ssh读取是stdin的全部内容。
现在咨询背景事实#3,并回答问题:当ssh完成时stdin上还剩下什么?
现在,考虑一下发送电子邮件的post-receive挂钩。必须读取其标准输入以查看哪些引用已更新。它的stdin会得到什么数据?
如果你阻止ssh
读取(从而消耗)所有输入,后接收钩子将能够读取(并消耗,但现在无关紧要)所有输入,因此正确运行。