0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Git が追跡するのは「+x か否か」だけで、644/755/777 など細かな差は保持しない

0
Posted at

■ 背景

  1. プロジェクトを別PCにコピーした時、ファイル権限が変更されてしまった
  2. 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 {} +

■ まとめ

  1. Git が追跡するのは「+x か否か」だけで、644/755/777 など細かな差は保持しない
  2. diff に 100755 と出ても、実際は 777 などの可能性がある
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?