22

Git に問題があります。Google と StackOverflow で解決策を検索しましたが、何も役に立ちません。

問題は、git が作業ディレクトリ内のファイルを更新するたびに (ブランチをチェックアウトしたり、ブランチをマージしたりするときなど)、「グループに書き込み可能」フラグが追加されるようにファイルのアクセス許可が変更されることです。そして、ファイルがグループに書き込み可能な場合、私のApacheはファイルに対して「エラー500」を表示します。

例: ファイル index.php があります。権限は「-rwxr-xr-x」です。現在の (アクティブな) ブランチはマスターです。このファイルは、ブランチ「develop」で変更されました。「git checkout development」を実行すると、ファイル index.php は「-rwxrwxr-x」というパーミッションを取得します (グループに書き込み可能が追加されます)。そして、私のサイトは機能しなくなります。Apacheはphpファイルでこのフラグを許可していないため(理由はわかりませんが、これを変更することはできません)。

「git checkout develop」を実行するたびに、「chmod gw index.php」も実行する必要があります。2 つのコマンドを実行するのは好きではありません (コマンドを実行するのを忘れて、サイトが機能しない場合もあります)。

この問題を解決するにはどうすればよいですか? これはumaskに関連するものだと思います。ウェブで見つけたいくつかのトリックを実行しましたが、何も機能しません。

ありがとう。

4

4 に答える 4

12

簡単な答えは、このシェル関数を に配置すること~/.profileです。説明は次のとおりです。

git(){(umask 0022; command git "$@")}

umaskはプロセスのプロパティです。親プロセスから継承され、後で内部から変更できます。通常、umask を変更するコマンドも umask という名前です。

Git には umask を設定するための構成オプションがなく、実行後に umask を変更しません。外部から Git の umask を設定し、親プロセス (通常はシェル) から継承する必要があります。

うーん、あなたは git 以外の何かが umask を変更したという考えを嫌っているようですね。ということで、実行時だけ変更しましょうgit

シェルが行を実行するとき、行の最初の単語を取得し、その名前の関数を見つけようとします。存在しない場合にのみ、その名前のコマンドを で見つけようとしますPATH。上で書いた関数の名前gitは であるため、 を直接呼び出すとgit、コマンドの代わりに実行されgitます。

この関数はサブシェルを実行し、その umask を変更しgitて、サブシェル内からコマンドを実行します。Git が作業を終了すると、サブシェルも終了し、元のシェル インスタンスは元の umask のままになります。

ただし、関数はそれ自体をバイパスする方法も示しています。またはgitを介し​​て呼び出しても、関数は呼び出されません。ただし、まともな使用には、これで十分です。command git/usr/bin/git

于 2013-11-04T15:14:40.137 に答える
9

ファイルの実行をバイナリとして許可するのはちょっと危険です。とにかく、umask で問題を解決しました。私のpost-receiveスクリプトは次のようになります。

!/bin/sh
umask 002
GIT_WORK_TREE=/var/www/site git checkout -f

だから、 にfile permission設定し664、 にdirectory permissions設定し775ます。これは私にぴったりです。

PS user の.profileファイルにumask を設定しgitても効果がありません。理由がわかりません。なぜこれが起こるのか知っている場合はコメントアウトしてください。

于 2014-08-22T06:53:05.297 に答える
4

バックポートされた Xenial バージョン 4.x Linux カーネルを使用して、Ubuntu 14.04 (Trusty) に NFS 経由でマウントされたホーム ディレクトリへのリポジトリをチェックアウトするときに、この問題が発生しました。ローカル ディレクトリへの Git クローンは問題ありませんでした。さらに奇妙なことに、2 番目の Ubuntu 14.04 サーバーは、同じマウントされたディレクトリで同じ問題を示しませんでした。

いろいろ調べてみると、git が open() システム コールを呼び出して、オプション O_CREAT、O_WRONLY、O_EXCL、モード 0666 で各ファイルを作成する strace を使用していることがわかりましたが、次の syscal は fstat() に対するものでした。ファイルで、それがモード 0700 であると教えてくれました。私の場合、問題はリポジトリ内の特定のファイルにのみ影響を与えました。'git ls-index' がほとんどのファイルでモード 0644 を示しているにもかかわらず、正しく作成されたものとそうでないものがあります。ただし、クローンのパーミッションが間違っていたのは常に同じファイルでした。

2 つのシステムのカーネル バージョンに違いがあることに気付き、次のバグを発見しました: https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1654288

カーネルを 4.4.0-98 (4.4.0-59 から) にアップグレードすると、これが修正されました。バージョン 3.x の Linux カーネルをまだ使用しているいくつかのホストを確認しましたが、これらには問題はありませんでした。

于 2018-02-09T14:30:26.290 に答える