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 18.04 LTS;
- 本地机器Windows10,使用"git-bash"管理存储库
"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
有权写入该目录。假设 bob
是 users
组的一部分,您可以 运行 chmod g+w /srv/tmp
来创建目录。或者,您可以为此目的使用 /tmp
,因为所有用户都有权在此处写入。
对于 /var/www/html/repo
,您可能需要执行 chgrp -R users /var/www/html/repo
,然后递归地设置每个目录的写入权限。
我对 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 18.04 LTS;
- 本地机器Windows10,使用"git-bash"管理存储库
"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
有权写入该目录。假设 bob
是 users
组的一部分,您可以 运行 chmod g+w /srv/tmp
来创建目录。或者,您可以为此目的使用 /tmp
,因为所有用户都有权在此处写入。
对于 /var/www/html/repo
,您可能需要执行 chgrp -R users /var/www/html/repo
,然后递归地设置每个目录的写入权限。