2012-05-09 15 views
0

私は最近、毎日のワークフローでGitを使い始めました。Gitフックを使用してウェブサイトを展開するにはどうすればよいですか?

私はVPSのweblog.gitというフォルダの下に裸のオンラインレポ(git init --bare --shared)を置いて、必要に応じていつでもローカルからその変更をプッシュします。これは絶対にうまくいきます。現在、私のローカルリポジトリにデータを保存するときに、変更をオンラインでプッシュしますが、手動でファイルをpublic_htmlフォルダに移動する必要があります。

私はhttp://toroid.org/ams/git-website-howtoに記載されているようにgitフックを使用しようとしましたが、それは私のために働いていないアクセス許可です。

public_htmlとwebsite.gitの両方のフォルダはwww-data:開発者が所有していますが、ポスト受信フックが起動すると古いファイルとのリンクを解除できず、新しいファイルはjackによって自動的に所有されます:ジャックは私がSSHサーバーとのユーザーです。

マイフック/ポスト受けるファイルが実行可能であると含まれています

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

そして、私のオンラインレポは、私が間違って何をやっている

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

に保存されていますか?

答えて

1

これは、基本的なオペレーティング・システム権限の問題である:URLはsshができますなぜあなたは変更をプッシュするsshを使用する場合、Gitはあなたのいくつかのユーザとして(リモートホストに接続するためにsshを使用して選んだが、これがある:// (コミット、ツリー、ブロブ、および/またはタグ)をピックアップしてそれらをターゲットレポに挿入するコマンドをホスト上で実行するように、ユーザホスト@ /そのユーザーが誰であっても、フックを実行しています。受信後のフックが実行されると、そのユーザーとして実行されます。

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


注:少し実験した(1.7.0.3)バージョンのgitをターゲットホストにインストールします。これには、相対パスが失敗するバグがあります。これを回避するには、ここで私は hooks/post-receiveになってしまったものです(注、それが押され-にされたかどうか確認しないと、これは非常に原始的である):(修正されたバグとの)新しいgitので

#! /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) 

上記のすべてを必要とするわけではありません(ただし、手動で実行するとフックが機能しますが便利です)。

+0

感謝をしなければなりません。あなたが正しいです、それは許可の問題です!私はpublic_htmlフォルダを777に設定し、すべてのユーザがそれに書き込み、ファイルを変更してからプッシュを実行することができました。エラーはありませんでした.public_htmlのファイルは、所有者をwww-dataからjackに変更しました(ジャックがフックを実行しているので、あなたが言うように)、ファイルも755に変更されました。まだ更新していない!私は他の人がこれをどのように動かすのかと思います...? –

+0

Hm。すべてを非常に書き込み可能にしたい場合は、 'git checkout -f'を実行する前に' umask 0'を追加してみてください。また、git 1.7.4で修正されたバグのために、私はすべてのパスが常に絶対的であり、$ GIT_WORK_TREEに "cd"したことを確認しなければなりませんでした。回答を編集するを参照してください。 – torek

0

あなたと同様の権限の問題があり、デプロイにはanother techniqueを使用しましたが、gitユーザーを使用するようにApacheを変更しました。それはgit 1.7.9Ubuntu 12.04.1 LTSで私のためにApache/2.2.22と働いています。

私のgitユーザーはgitと呼ばれ、私のApacheはubuntuユーザーです。私が含まれるように(あなたも/etc/apache2/http.confでそれを行うことができます)/etc/apache2/conf.d/securityにApacheの設定を編集する必要がありました:

User git 
Group git 

今私の/var/www/myprojectgit:gitユーザー/グループと私のapacheの用途でファイルを作成し、プッシュ上のすべてのファイルを展開します同じユーザー/グループを実行します。

あなたはいつもyur hooks/post-receiveスクリプトの最後にこれを追加することができます。

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

は今、あなたは自分のサーバーを再起動するかの情報のためservice apache2 restart

関連する問題