web-dev-qa-db-ja.com

git内のファイルとディレクトリのパーミッションを変更した場合、それらを復元する方法は?

Git checkoutがあります。すべてのファイル許可は、gitが本来あるべきと考えるものとは異なるため、すべて変更されたものとして表示されます。

ファイルの内容に触れることなく(アクセス許可を変更したいだけ)、すべてのファイルのアクセス許可をgitが想定しているものに設定するにはどうすればよいですか?

251
Dale Forester

Gitはgit diff -pを使用してパッチを作成するときに、ファイル許可を追跡し、許可の変更を公開します。したがって、必要なものは次のとおりです。

  1. 逆パッチを作成する
  2. 許可の変更のみを含める
  3. 作業コピーにパッチを適用します

ワンライナーとして:

git diff -p -R --no-color \
    | grep -E "^(diff|(old|new) mode)" --color=never  \
    | git apply

git configのエイリアスとして追加することもできます...

git config --global --add alias.permission-reset '!git diff -p -R --no-color | grep -E "^(diff|(old|new) mode)" --color=never | git apply'

...そして、あなたはそれを経由して呼び出すことができます:

git permission-reset

シェルがbashである場合、'を囲む"引用符の代わりに!gitを使用してください。そうでない場合、最後のgitコマンドに置き換えられます。あなたが走った。

-Rgit diffを使用するだけで、面倒なsedコマンドが不要になったことを指摘してくれた@Mixologicに感謝します。

512
muhqu

git config core.fileMode falseを試してください

注:core.fileModecase-sensitiveです!

git config manページから:

core.fileMode

Falseの場合、インデックスと作業コピー間の実行可能ビットの違いは無視されます。 FATのような壊れたファイルシステムで役立ちます。 git-update-index(1) を参照してください。

デフォルトはtrueです。ただし、git-clone(1)またはgit-init(1)は、リポジトリの作成時に適切な場合、core.fileModeをプローブして設定します。

105
Tim Henigan

Gitは、実行可能スクリプト以外のファイル許可を保存しません。 git-cache-meta のようなものを使用して、ファイルの所有権と許可を保存することを検討してください。

Gitは、755(実行可能)と644(実行不可)の2種類のモードのみを保存できます。ファイルが444だった場合、gitは644を保存します。

9
kroger
git diff -p \
| grep -E '^(diff|old mode|new mode)' \
| sed -e 's/^old/NEW/;s/^new/old/;s/^NEW/new/' \
| git apply

ほとんどの場合は動作しますが、meldなどの外部diffツールがインストールされている場合は、-no-ext-diffを追加する必要があります

git diff --no-ext-diff -p \
    | grep -E '^(diff|old mode|new mode)' \
    | sed -e 's/^old/NEW/;s/^new/old/;s/^NEW/new/' \
    | git apply

私の状況で必要でした

6
zainengineer

また、事前/事後チェックアウトフックを試してトリックを行うこともできます。

参照: Gitのカスタマイズ-Gitフック

0
Doug