web-dev-qa-db-ja.com

GitRemoteにプッシュするときの権限の問題

過去数日間、サーバーにGit Remoteをセットアップして、Webサーバーへの変更をプッシュできるようにしました。問題は、実行中に次のエラーが発生することです。

$ git Push --porcelain --progress --recurse-submodules=check live refs/heads/master:refs/heads/master
'master' pushed: d689cce..4e755fc
Delta compression using up to 4 threads.
Total 3 (delta 2), reused 0 (delta 0)
remote: error: unable to create file .gitignore (Permission denied)        
remote: error: unable to create file .gitignore~ (Permission denied)        
remote: error: unable to create file index.js (Permission denied)        
remote: error: unable to create file package.json (Permission denied)   

これはファイルとフォルダーの所有権と関係があり、私やgitは特定のフォルダーへの書き込みアクセス権を持っている場合と持っていない場合があります。

問題は、どのフォルダに書き込めないのか、それを解決する方法がわからないことです。

私は最初からWebサーバーをセットアップするのは初めてなので、次のようにしました。

VPSを使用してGitで自動展開を設定する方法 を実行して、リモートを起動して実行する方法を確認しました。これにより、次の2つのフォルダーを作成することになりました:/var/repo/site.git/var/www/website

パーミッションについて何も言われずに、先に進んで、言われたようにリモートにプッシュしようとしましたが、すぐに最初のパーミッションの障害にぶつかりました。

そこで、新しいグループを作成し、ユーザーをグループに追加して、/var/repoをそのグループが775読み取り/書き込み/実行権限で所有するように提案した友人に相談しました。彼はまた、/var/wwwフォルダーに適切な権限があることを確認するために、提案どおりに実行する必要があることを提案しました ここ 。しかし、それでも、上記のエラーに示されているように、リモコンにプッシュすることはできません。

それで、これを修正するために私は何をすべきですか?私はここでちょっと障害になっています。

私が使用するものに関するいくつかの情報:

  • クライアントOS:OSX Yosemite
  • サーバーOS:Ubuntu 15.04
  • Gitクライアント:SmartGit 6.5(便宜上)
  • リモートへの接続にHTTPSではなくSSHを使用しています
2
Electric Coffee

問題は/ var/repoへの書き込みアクセスではありません-コピー/貼り付けしたエラーから、これは正しく設定されており、おそらく常にそうであったと思います。

問題は、/ var/wwwに書き込み権限がないことです。

設定したものにリンクした手順に従うことで、プッシュしたファイルをサーバーのgitリポジトリに自動的に取得し、/ var/wwwに公開するスクリプトが作成されます。これは私の意見では賢明なアプローチですが、そのスクリプト(ファイル/ var/repo/hooks/post-receiveにあります)は、gitリポジトリにプッシュするのと同じように実行されています。そのユーザーは/ var/wwwに書き込む権限を持っていないようです

前の回答の手順をすでに実行していると仮定すると、次の2つの追加コマンドで問題が解決するはずです。

chown -R root:git-users /var/www/

chmod -R g+rw /var/www/    
3
Jason Williams

コメントで、ユーザーがusername@serverを介してgitにプッシュすると言ったので、すべてのgitユーザーがリポジトリへの読み取りおよび書き込み権限を持っていることを確認する必要があります。

たとえば、git-usersという名前の共通グループにすべてのユーザーを追加します。

groupadd git-users

次に、各gitユーザーをグループに追加します。

usermod -a -G git-users <username>

ここで、gitリポジトリの所有権グループを変更します。

chown -R root:git-users /var/repo/

次に、グループがリポジトリに対して読み取りと書き込みを行えるように権限を設定します。

chmod -R g+rw /var/repo/

これで、グループgit-usersのすべてのメンバーが読み取りおよび書き込みアクセス権を持ちます。

ここで、ディレクトリにのみsetgidビットが必要です。

 find /var/repo/ -type d -exec chmod g+s {} \;

さらに、リモートgit構成でsharedRepository設定を有効にする必要があります。

[core]
sharedRepository = true
1
Will