git pull
または を実行するたびにgit reset
、git
権限と所有権の変更がリセットされます。自分で確認してください:
#!/usr/bin/env bash
rm -rf 1 2
mkdir 1
cd 1
git init
echo 1 > 1 && git add 1 && git ci -m 1
git clone . ../2
cd $_
chmod 0640 1
chgrp http 1
cd ../1
echo 12 > 1 && git ci -am 2
cd ../2
stat 1
git pull
stat 1
出力:
$ ./1.sh 2>/dev/null | grep -F 'Access: ('
Access: (0640/-rw-r-----) Uid: ( 1000/ yuri) Gid: ( 33/ http)
Access: (0664/-rw-rw-r--) Uid: ( 1000/ yuri) Gid: ( 1000/ yuri)
回避する方法はありますか?
いくつかのファイル/ディレクトリを Web サーバーから書き込みアクセスできるようにしたいと考えています。
答え1
実行しているユーザーのデフォルト グループが に設定されているようですyuri
。次のようにして確認できます。
$ id -a
uid=1000(saml) gid=1000(saml) groups=1000(saml),10(wheel),989(wireshark)
アカウントの UID は次のとおりです。uid=1000(saml)
一方、デフォルト グループは でgit=1000(saml)
、セカンダリ グループはその後になります。
注記:git clone に特定の所有権を持たせたい場合は、少なくとも 2 つのオプションがあります。
オプション1
次のように、必要な権限を持つ親ディレクトリを設定します。
$ mkdir topdir
$ chgrp http topdir
$ chmod g+s topdir
$ cd topdir
$ git clone ....
これにより、ディレクトリは、topdir
その下にあるすべての子ディレクトリにグループを適用するように強制されましたhttp
。これは大部分は機能しますが、ファイルをこの git clone ワークスペースに移動すると、上記の変更によってそれらのファイルにグループが適用されないため、問題が発生する可能性があります。
オプション 2
作業を始める前に、デフォルトのグループをhttp
次のように変更します。
$ newgrp http
$ git clone ...
この方法では、作成されたすべての新しいファイルのグループが、http
通常のデフォルト グループ ではなく に強制的に設定されますyuri
が、このワークスペースで作業する前に を実行することを忘れなければ、この方法は機能しませんnewgrp
。
その他のオプション
どちらも受け入れられない場合は、git ワークスペース ディレクトリで ACL の使用を試みてください。このサイトの複数の Q&A でこれについて説明されています。たとえば、次のタイトルの Q&A があります。Linux で新しいファイルにグループ権限を継承させる。
答え2
私が使っている解決策はユーザーとしてコマンドを実行する保持したい権限を持つもの:
sudo -u user command
これにより、権限が変更されなくなります。ファイル権限を Web サーバー ユーザーに設定した状態で、VPS 上の git リポジトリを更新するときにこれを使用します。
同じ質問も参照ここ。