Gitとファイル実行権限
概要
Gitは、ソースコードやテキストの内容(中身)だけでなく、「ファイルに実行権限があるかどうか」もバージョン管理しています。
UNIX系OSではファイルの実行可否はファイルシステムのinodeメタデータに記録されていますが、Gitはこの「実行ビット(executable bit)」をリポジトリ内で追跡します。 🔍 実行権限の仕組み
ファイルのパーミッションは9ビットで管理されます
table:ファイルの操作権限
対象 読み(r=4) 書き(w=2) 実行(x=1)
所有者 (user) r w x
グループ (group) r w x
その他 (other) r w x
例:rwxr-xr-x → 数値では 755
→ 所有者のみ書き込み可、他は読み取り・実行のみ。
🧱 Gitが管理するのは「1ビット」
Gitはファイルのフルパーミッションを記録するわけではありません。
「実行可能か否か」だけを1ビットで管理します。
table:git管理
状態 Git内部の記録 意味
実行可能 100755 +x が立っている
実行不可 100644 +x が立っていない
🔧 実行権限の確認方法
$ git ls-files --stage | grep bin/ci-setup
出力例
code:text
100755 a1b2c3d4e5f6g7h8i9j0 bin/hoge-setup
左端の 100755 → 実行可能ファイル
100644 なら実行不可
よくあるトラブルと解決策
CIで Permission denied
実行権限がGitに登録されていない
ローカルで chmod +x → git add
ファイルをWindowsで編集後に実行権限が消えた
OSやGit設定の違い
git config core.filemode trueを確認
core.filemode設定により、Gitがパーミッション変更を検出するかどうかが変わります。
$ git config --get core.filemode
true
ファイルモードの変更(実行権限の変更)も検出する
通常、Linux/macOSでは true
false
実行権限の変更は無視する
Windows環境では false になっていることが多いです。
Shebangとの関係
Shebang (#!/usr/bin/env ruby など) はファイルの中身に書く実行インタプリタ指定であり、「実行可能ビットが立っている」こととは別です。
Shebangがあっても実行ビットがなければ実行できない。
実行ビットがあってもShebangがなければ何で解釈するか分からない。