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で議論されています。たとえば、次のようになります。Linuxでグループ権限を継承する新しいファイルをインポートする。
答え2
私が使った解決策はユーザーとしてコマンドを実行する維持する権限が必要です。
sudo -u user command
これにより権限は変更されません。 Webサーバーのユーザーにファイル権限を設定しながら、VPSでgitリポジトリを更新するときにこれを使用します。
同じ質問も参照してくださいここ。