■ 背景
- プロジェクトを別PCにコピーした時、ファイル権限が変更されてしまった
- git diff の結果から、644 → 755 に変更されているように見えたが、実際は 755 ではなく、777 であった
■ Gitが記録するモード
- 通常ファイルは2種類だけ: 100644 (= 非実行) と 100755 (= 実行可)。実際のパーミッションが 744 や 777 でも、+x が立っていれば Git では 100755 と記録される
- Git は他の r/w ビットは保存しないため、実際の 744→755 などの差は Git 上では同じ 100755 として扱われる
■ old mode 100644 new mode 100755 の読み方
diff --git a/src/main/XXX.java b/src/main/XXX.java
old mode 100644
new mode 100755
「非実行 → 実行可に変わった」ことだけを示す。777 でも 755 でも 705 でも、+x が付いた時点で 100755 に見える。
■ なぜ diff で 755 に見えるのか
Git が保持するのは “実行可かどうか” の1ビットだけで、表示上 755 と出るのは慣例的な表現に過ぎない。実際のパーミッション値とは一致しないことがある。
■ core.filemode について
- core.filemode=true(デフォルトの Unix/WSL)だと、ワークツリーの実行ビット変化を検知して diff に出す
- ファイルシステムが実行ビットをうまく扱えない環境(例: Windows/NTFS)では core.filemode=false にすると実行ビットの変化を無視させられる
■ 実行ビットを持つファイルを一括確認・修正する例
※元々が 644 であったとは限らないが、実行ビットを外すという目的であれば
# 実行ビットが立っているファイルを表示
find . -type f -perm -111 -print
# 実行ビットを外す(.git配下除外)
find . -type f -perm -111 ! -path './.git/*' -exec chmod 644 {} +
■ まとめ
- Git が追跡するのは「+x か否か」だけで、644/755/777 など細かな差は保持しない
- diff に 100755 と出ても、実際は 777 などの可能性がある