Git checkoutがあります。すべてのファイル許可は、gitが本来あるべきと考えるものとは異なるため、すべて変更されたものとして表示されます。
ファイルの内容に触れることなく(アクセス許可を変更したいだけ)、すべてのファイルのアクセス許可をgitが想定しているものに設定するにはどうすればよいですか?
Gitはgit diff -p
を使用してパッチを作成するときに、ファイル許可を追跡し、許可の変更を公開します。したがって、必要なものは次のとおりです。
ワンライナーとして:
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
コマンドに置き換えられます。あなたが走った。
-R
でgit diff
を使用するだけで、面倒なsed
コマンドが不要になったことを指摘してくれた@Mixologicに感謝します。
git config core.fileMode false
を試してください
注:core.fileMode
はcase-sensitiveです!
git config
manページから:
core.fileMode
Falseの場合、インデックスと作業コピー間の実行可能ビットの違いは無視されます。 FATのような壊れたファイルシステムで役立ちます。 git-update-index(1) を参照してください。
デフォルトはtrueです。ただし、git-clone(1)またはgit-init(1)は、リポジトリの作成時に適切な場合、core.fileModeをプローブして設定します。
Gitは、実行可能スクリプト以外のファイル許可を保存しません。 git-cache-meta のようなものを使用して、ファイルの所有権と許可を保存することを検討してください。
Gitは、755(実行可能)と644(実行不可)の2種類のモードのみを保存できます。ファイルが444だった場合、gitは644を保存します。
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
私の状況で必要でした
また、事前/事後チェックアウトフックを試してトリックを行うこともできます。