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"
ローカルネットワークには2台のマシンがあります。
/srv/git/repo.git
ディレクトリに構成されたベアリポジトリがあり、そのリポジトリはに複製され/home/bob/projects/repo
ます。グループgitusers
は/srv/git
ディレクトリを所有し、rwx権限を持っています。グループのbob
メンバーでもありgitusers
ます。
このマシンでローカルリポジトリから変更をプッシュしますが、問題はありません。フックが実行され、プッシュされたコードがWebサーバーにデプロイされ、phpスクリプトが呼び出され、最新のコミットメッセージがDBに追加されます。結構です。
問題は、Windowsを搭載したローカルマシンにあります。
repo
SSH経由で複製されたものがあります。bob
誰がメンバーでgitusers
あり、権限を持っているかをSSHで接続しました。(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
それで、フックは、sshを介してリモートで実行されている間、何らかの理由でコマンドを実行できないようですか?この問題を解決する方法がわかりません。答えを2日間検索し、設定権限で試しましたが、私は間違いなくいくつかの詳細を見逃していると思います:/
また、hookはmkdir、rm、moveなどのLinuxコマンドを実行できませんが、curlコマンドを実行し、最新のコミットメッセージがDBに正しく送信されます: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
から、各ディレクトリに書き込み権限を再帰的に設定する必要があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加