web-dev-qa-db-ja.com

プル時にgitがアクセス許可と所有権を変更しないようにする方法はありますか?

毎回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サーバーが書き込み可能なようにしたい。

11
x-yuri

これは、実行しているユーザーのデフォルトグループが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でグループのアクセス許可を継承するための新しいファイルの取得 .

4
slm

私が使用する解決策は、保持したい権限を持つ ユーザーとしてコマンドを実行する です。

Sudo -u user command

これにより、権限が変更されなくなります。私はVPSのgitリポジトリを更新するときに、ファイル権限をwebserverユーザーに設定したままにします。

同じ質問 here も参照してください。

2
Deleet