2010-04-13 88 views
24

我有我的服务器上更新后挂机,这样,当我什么用户运行git钩子?

git push 

它在实时web目录上拉。但是,尽管推送总是成功,但更新后的挂钩有时会失败。

钩很简单:

#!/bin/sh 
# 
# An example hook script to prepare a packed repository for use over 
# dumb transports. 
# 
# To enable this hook, rename this file to "post-update". 
cd /var/www 
env -i git pull 

我推更新来自不同的地方,但有时我需要登录的服务器上的根和手册册做

env -i git pull 

但我只需要20%的时间。任何想法为什么它会随机失败?另外,我如何获取它来记录错误消息,因为它可能作为无法写入文件系统的人运行?

+0

你是否从所有这些地方以相同的方式推动?也就是说,所有的远程URL都是一样的吗? (尤其是用户@主机名部分) – Cascabel 2010-04-13 04:34:59

+0

另外,当你说失败时,你是否确实意味着它失败了,并且有一个权限被拒绝的错误,表明它以特权不足的用户身份运行?还是因为一些完全不相关的原因而失败,与uid运行无关? – Cascabel 2010-04-13 04:38:06

+0

我实际上是从不同的地方推送的:有时它是user1 @ hostname,othertimes,user2 @ hostname等(它们都有这个问题)。 失败时没有可以看到的错误消息,而且我不确定如何获取。在我的更新后,我添加了> echo $ USER> /log.txt,但没有写入任何内容(也没有创建文件)。这让我想到用户推送,没有权限。但是,如果我甚至不能写出错误信息,我将如何知道? – ash 2010-04-13 17:35:17

回答

18

挂钩以用户进行推送的方式运行。如果您有某种预先设置的设置,可能是gitgitosis这样的用户,也可能是您。只要看看你如何配置远程。 (git remote show <remote-name>或者只是在不知道的情况下检查.git/config)推测你是通过SSH推送的,URL中有一个username @ hostname。

P.S.这很快就证明了这一点 - 只需在本地克隆一个回购站,用echo $USER或类似的方法抛出更新后的挂钩,然后尝试按自己或其他用户(直接或通过ssh)推送。

2

我决定通过创建一个测试这个我gitlab 6服务器上预先接收钩呼应了用户信息

$ cat /home/git/repositories/foo/foo.git/hooks/pre-recieve 
#!/bin/bash 
set -x 
echo -e "The user the hook is run as is $USER" 
echo -e "Just to doublecheck, the user is $(whoami)" 
exit 1 

看起来它运行的git的用户

$ git push 
Counting objects: 3, done. 
Delta compression using up to 8 threads. 
Compressing objects: 100% (2/2), done. 
Writing objects: 100% (3/3), 269 bytes | 0 bytes/s, done. 
Total 3 (delta 1), reused 0 (delta 0) 
remote: + echo -e 'The user the hook is run as is' 
remote: The user the hook is run as is 
remote: ++ whoami 
remote: + echo -e 'Just to doublecheck, the user is git' 
remote: Just to doublecheck, the user is git 
remote: + exit 1 
+0

原因是所有这些服务器都配置一个unix用户通过'〜git/.ssh/authorized_keys'文件来接受传入的ssh连接。该文件将这些连接委托给一个脚本,该脚本将处理传入的数据。对于这样的服务器,可以推导出推送人员的姓名,例如,通过假设它是最近一次提交的同一个人。然而这可能根本不适用。取决于用户的工作模式。最好只检查或报告个人提交的作者/提交者。 – cfi 2016-01-21 15:45:45