git が pull 時に権限と所有権を変更しないようにする方法はありますか?

git が pull 時に権限と所有権を変更しないようにする方法はありますか?

git pullまたは を実行するたびにgit resetgit権限と所有権の変更がリセットされます。自分で確認してください:

#!/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 リポジトリを更新するときにこれを使用します。

同じ質問も参照ここ

関連情報