毎回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サーバーが書き込み可能なようにしたい。
これは、実行しているユーザーのデフォルトグループが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つのオプションがあります。
次のように、必要な権限を持つ親ディレクトリを設定します。
_$ mkdir topdir
$ chgrp http topdir
$ chmod g+s topdir
$ cd topdir
$ git clone ....
_
これにより、ディレクトリtopdir
は、その下の子ディレクトリにグループhttp
を適用するように強制しました。これは全体的に機能しますが、ファイルをこのgit cloneワークスペースに移動すると、これらのファイルには上記の変更によってグループが適用されないため、問題が発生する可能性があります。
作業を行う前に、次のようにデフォルトグループをhttp
に変更します。
_$ newgrp http
$ git clone ...
_
この方法では、作成されたすべての新しいファイルのグループが、通常のデフォルトグループであるhttp
ではなくyuri
に設定されますが、これは、newgrp
このワークスペースで作業する前。
これらのどちらも受け入れられない場合は、代わりにgitワークスペースディレクトリでACLを使用してみてください。これらは、このサイトの複数のQ&Aで説明されています。たとえば、このQ&Aというタイトルの Linuxでグループのアクセス許可を継承するための新しいファイルの取得 .
私が使用する解決策は、保持したい権限を持つ ユーザーとしてコマンドを実行する です。
Sudo -u user command
これにより、権限が変更されなくなります。私はVPSのgitリポジトリを更新するときに、ファイル権限をwebserverユーザーに設定したままにします。
同じ質問 here も参照してください。