0

私は最近、毎日のワークフローで Git を使い始めました。

VPS の website.git というフォルダーの下にベア オンライン リポジトリ (git init --bare --shared) があり、必要に応じてローカルからプルの変更をプッシュすると、まったく問題なく動作します。今、ローカル リポジトリにデータを保存するときに、変更をオンラインにプッシュしますが、ファイルを public_html フォルダーにも手動で移動する必要があります。

http://toroid.org/ams/git-website-howtoで説明されているように git フックを使用してみましたが、機能していないのはアクセス許可です。

public_html フォルダーと website.git フォルダーの両方が www-data:developers によって所有されていますが、post-receive フックが作動すると、古いファイルのリンクを解除できず、新しいファイルは自動的に jack:jack によって所有されます。ユーザー I SSH でサーバーに接続します。

私のhooks/post-receiveファイルは実行可能で、以下が含まれています:

#!/bin/sh
GIT_WORK_TREE=/home/web/website.com/public_html git checkout -f

そして、私のオンラインレポはに保存されています

/home/web/website.com/website.git

私は何を間違っていますか?

4

2 に答える 2

1

これは基本的なオペレーティング システムのパーミッションの問題です。ssh変更をプッシュするために使用する場合、git はsshリモート ホストに接続するために使用します (選択したユーザーとして — これが URL で ssh:// user@host /path を許可する理由です) 。プッシュされているオブジェクト (コミット、ツリー、ブロブ、および/またはタグ) を取得し、それらをターゲット リポジトリに挿入するコマンドをホスト上で実行します。そのユーザーが誰であれ、フックも実行しています。したがって、post-receive フックが実行されると、そのユーザーとして実行されます。

public_html ディレクトリをより書き込み可能にすることができます (これにより、すべてのgit pushユーザーが書き込み可能になります)。ユーザーとして ssh できますwww-data。または、set-uid プログラムを使用して www-data ユーザーとして実行することもできますが、set-uid プログラムのgit checkout -fすべての通常の危険性があります。(このsudoコマンドは、最後のテクニックに使用できます。sudo -n -u www-data実際にこの種のものを設定したことはありませんが、フックが必要になると思います。)


注: 少し実験したところ、ターゲット ホストに古い (1.7.0.3) バージョンの git がありました。これには、相対パスが失敗するバグがあります。それを回避するために、これが私が最終的に得たものですhooks/post-receive(注、これはプッシュ先をチェックしないため、非常に原始的です):

#! /bin/sh
umask 0 # let everyone have write permission on everything
export GIT_DIR=$(readlink -f $(git rev-parse --git-dir))
export GIT_WORK_TREE=$(readlink -f /tmp/t)
(cd $GIT_WORK_TREE && git checkout -f)

新しい git (バグが修正されている) では、上記のすべては必要ありません (ただし、手動で実行するとフックが機能するので便利です)。

于 2012-05-09T10:13:10.153 に答える
0

あなたと同様の権限の問題があり、別の手法を使用して展開を行いましたが、git ユーザーを使用するように apache を変更しました。それは私のために働いてgit 1.7.9Ubuntu 12.04.1 LTSますApache/2.2.22

私のgitユーザーが呼び出されgit、Apacheがubuntuユーザーを使用しました。以下を含めるために、Apache構成を編集する必要がありました/etc/apache2/conf.d/security(これも編集できます)。/etc/apache2/http.conf

User git
Group git

これで、/var/www/myprojectプッシュ時にすべてのファイルがデプロイされ、git:gitユーザー/グループでファイルが作成され、Apache は同じユーザー/グループを使用して実行されます。

これはいつでも yurhooks/post-receiveスクリプトの最後に追加できます。

chown -R www-data:developers /home/web/website.com/public_html

サーバーを再起動するか、service apache2 restart

于 2012-10-31T18:53:38.087 に答える