什么用户运行git hook?

28
我在我的服务器上有一个 post-update 钩子,使得当我更新代码时可以运行一些脚本。
git push

它对实时网络目录进行了一次pull操作。然而,虽然push操作总是成功的,但post-update钩子有时会失败。

这个钩子非常简单:

#!/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
我在从各种地方推送更新,但有时我必须作为root登录到服务器并手动执行。
env -i git pull

虽然我只需要做20%的时间,但为什么它会随机失败?另外,由于它可能作为一个无法写入文件系统的人运行,我该如何记录错误消息呢?


你是否从所有这些地方以相同的方式推送?也就是说,远程URL对于它们所有都是相同的吗?(特别是user@hostname部分) - Cascabel
此外,当您说它失败时,您是否实际上意味着它因权限不足而失败,并显示为以用户身份运行?还是它因某些完全无关的原因而失败,与运行它的uid无关? - Cascabel
我实际上是从不同的地方推送:有时是user1@hostname,有时是user2@hostname等(它们都有这个问题)。它失败了,没有任何错误消息,我也不知道该怎么获取。在我的post-update中,我添加了> echo $USER > /log.txt,但那里什么也没写(也没有创建文件)。这让我想到推送的用户没有权限。但是如果我连错误消息都不能写,我怎么会知道呢? - atp
就像用户在仓库中推送需要写入权限一样,他们在钩子目录中需要执行权限。这足以检查(在尝试 cd ... git pull 之前)用户是否具有足够的权限来运行脚本的其余部分,如果没有,则打印错误并干净地退出。 - Cascabel
2个回答

20

这些钩子是由执行推送操作的用户运行的。如果您有某种预先设置的环境,可能会像gitgitosis这样的用户,或者可能是您自己。只需查看远程配置方式即可(使用git remote show <remote-name> 或者直接检查.git /config文件)。假定您是通过SSH进行推送,并且在URL中有一个username@hostname。

附注:演示这一点非常快速-只需在本地克隆一个存储库,在其中添加一个带有echo $USER或类似内容的post-update钩子,然后尝试作为自己或不同的用户(直接或通过ssh)进行推送。


4
我决定在我的 GitLab 6 服务器上测试此功能,通过创建一个 pre-receive 钩子并回显用户信息来实现。
$ 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

原因是所有这样的服务器都配置了一个Unix用户来通过~git/.ssh/authorized_keys文件接受传入的SSH连接。该文件将这些连接委派给一个脚本,然后处理传入的数据。对于这样的服务器,可以推导出进行推送的人的姓名,例如假设是做了最近提交的同一个人。但是这可能并不总是正确的。这取决于用户的工作模式。最好只检查或报告单个提交的作者/提交者。 - cfi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接