post-如果我从本地机器推送更改,接收钩子无法执行某些命令

post-receive hook cannot execute some commands if I push changes from local machine

我对 post-receive 挂钩有疑问。挂钩的任务是将刚刚收到的代码部署到 web 服务器目录,并仅将最新的提交消息发送到 PHP 脚本。 钩子代码(在服务器机器的裸仓库中):

#!/bin/sh

# prod dir
TARGET="/var/www/html/repo"

# temp dir
TEMP="/srv/tmp/repo"

# git repo
REPO="/srv/git/repo.git"

mkdir -p $TEMP
git --work-tree=$TEMP --git-dir=$REPO checkout -f

cd $TEMP

cd /
rm -rf $TARGET
mv $TEMP $TARGET

cd $REPO
read oldrev newrev _branch
tail=$(git log -1 --pretty=format:'%s%b' $newrev)
curl -G 'http://example.com/phpscript.php' -d "msg=$tail"

本地网络中有两台机器:

"server" 机器 (Ubuntu)

/srv/git/repo.git 目录中配置了一个裸仓库,并将该仓库克隆到 /home/bob/projects/repo。组 gitusers 拥有 /srv/git 目录并具有 rwx 权限。 bob 也是 gitusers 组的成员。

当我从本机上的本地仓库推送更改时,没有问题。钩子正在执行,推送的代码被部署到网络服务器,php 脚本被调用,最新的提交消息被添加到数据库。很好

问题出在具有 Windows 的本地机器上。

本地机器(Windows)

有一个 repo 通过 SSH 克隆。我以 bob 身份通过 SSH 登录,他是 gitusers 的成员并拥有权限。 (事实上​​ bob 不是 gitusers 的成员是我之前的 SSH 连接问题)。远程也添加为 ssh://bob@servermachineip/srv/git/repo.git.

此时我收到以下错误(我已推送示例更改):

Enumerating objects: 7, done.
Counting objects: 100% (7/7), done.
Delta compression using up to 8 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 474 bytes | 474.00 KiB/s, done.
Total 4 (delta 2), reused 0 (delta 0)
remote: mkdir: cannot create directory '/srv/tmp/repo': Permission denied
remote: fatal: this operation must be run in a work tree
remote: hooks/post-receive: 15: cd: can't cd to /srv/tmp/repo
remote: rm: cannot remove '/var/www/html/repo/index.html': Permission denied
remote: mv: cannot stat '/srv/tmp/repo': No such file or directory
remote:   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
remote:                                  Dload  Upload   Total   Spent    Left  Speed
remote: 100    19    0    19    0     0    106      0 --:--:-- --:--:-- --:--:--   106
remote: Logged to remote db
To ssh://servermachineip/srv/git/repo.git
   24d56db..ab886dd  master -> master

所以看起来 hook 由于某种原因无法在通过 ssh 远程执行时执行命令?我不知道如何解决这个问题。搜索了两天的答案,尝试了设置权限,但我想我肯定错过了一些细节:/

此外,hook 无法执行 linux 命令,如 mkdir、rm 或 move,但它会执行 curl 命令并将最新的提交消息正确发送到数据库 :O

如何解决给定的问题?

提前致谢

编辑:

/srv 权限

total 8
drwxr-xr-x 4 root users 4096 lis 21 23:33 git
drwxr-xr-x 2 root users 4096 lis 22 23:31 tmp

/srv/tmp存在但为空

total 0

/var/www/html/repo 权限

total 1780
drwxr-xr-x 5 root root    4096 lis 22 23:31 assets
-rw-r--r-- 1 root root     702 lis 22 23:31 index.html
drwxr-xr-x 3 root root    4096 lis 22 23:31 js

用户 bob 无权在 /srv/tmp 中创建目录,并且可能无权删除 /var/www/html/repo 中的文件。

要创建目录或删除目录中的文件,用户必须具有目录的写权限。在这种情况下,只有 root 有权在 /srv/tmp 中创建目录,因为只有 root 有权写入该目录。假设 bobusers 组的一部分,您可以 运行 chmod g+w /srv/tmp 来创建目录。或者,您可以为此目的使用 /tmp,因为所有用户都有权在此处写入。

对于 /var/www/html/repo,您可能需要执行 chgrp -R users /var/www/html/repo,然后递归地设置每个目录的写入权限。