Gitでファイルを管理していると、「実行権限」の問題に悩まされることってありませんか?
特にWindowsで作業してLinuxサーバーにデプロイする場合、シェルスクリプトが実行できなくて困ったり、逆にファイルの権限が勝手に変わって「変更された」扱いになってしまったり…。
今回は、そんなGitの権限変更について、基本から実践まで詳しく解説していきます!
Gitの「権限」って何のこと?

まず基本から押さえておきましょう。Gitで管理される「権限」とは、主に実行権限(executable bit)のことを指します。
ファイルには以下のような権限があります:
- 読み取り権限(read):ファイルの内容を見られる
- 書き込み権限(write):ファイルを編集できる
- 実行権限(execute):ファイルをプログラムとして実行できる
実は、Gitが追跡するのはこのうちの実行権限だけなんです。読み取りと書き込みの権限は管理しません。
なぜ実行権限が重要なの?
シェルスクリプト(.shファイル)やPythonスクリプトなどを実行する際、実行権限がないと動きません。
特にLinuxやMacでは、実行権限がないファイルを実行しようとすると「Permission denied(権限がありません)」というエラーが出てしまいます。
Windowsで権限を変更する方法
Windowsには通常の「chmod(チェンジモード)」コマンドがありません。でも大丈夫!Gitの専用コマンドで権限を設定できます。
実行権限を付与する
git update-index --chmod=+x ファイル名
たとえば、deploy.shというスクリプトに実行権限を付けたい場合:
git update-index --chmod=+x deploy.sh
このコマンドを実行すると、Gitのインデックス(ステージング領域)に実行権限が記録されます。
実行権限を削除する
逆に実行権限を外したい場合は、+xを-xに変えるだけです:
git update-index --chmod=-x deploy.sh
権限変更の流れ
Windowsでの作業手順はこんな感じです:
# ファイルをステージングに追加
git add deploy.sh
# 実行権限を付与
git update-index --chmod=+x deploy.sh
# コミット
git commit -m "deploy.shに実行権限を追加"
# プッシュ
git push
重要なポイント: git addの後にgit update-indexを実行することで、権限情報がGitのインデックスに正しく記録されます。
Linux・Macで権限を変更する方法
Linux・Macの場合は、OSのchmodコマンドが使えます。そして嬉しいことに、Gitが自動的に権限変更を追跡してくれます!
chmodで権限を変更
# 実行権限を付与(所有者、グループ、その他全員に)
chmod +x deploy.sh
# より詳細な指定(755 = 所有者は読み書き実行可、他は読み実行のみ)
chmod 755 deploy.sh
# 所有者のみ実行可能
chmod 744 deploy.sh
権限番号の意味
chmod 755のような数字は、それぞれの桁が権限を表しています:
- 7(4+2+1):読み取り(4) + 書き込み(2) + 実行(1) = すべて可能
- 5(4+0+1):読み取り(4) + 実行(1) = 読み実行のみ
- 4:読み取りのみ
つまり755は:
- 所有者:すべての権限(読み・書き・実行)
- グループ:読み取りと実行
- その他のユーザー:読み取りと実行
Linux・Macでの作業手順
# 実行権限を付与
chmod +x deploy.sh
# 変更を確認
git diff
# → old mode 100644
# → new mode 100755 と表示される
# ステージングに追加
git add deploy.sh
# コミット
git commit -m "deploy.shに実行権限を追加"
# プッシュ
git push
Linux・Macではchmodで権限を変更すると、Gitが自動的に変更を検知してくれます。あとは通常のgit add、git commitの流れでOKです!
権限の変更を確認する方法
「今、このファイルの権限はどうなってるの?」と確認したいときは、以下のコマンドが便利です。
Gitが追跡している権限を確認
git ls-files --stage deploy.sh
結果の例:
100755 abc123... 0 deploy.sh
この最初の数字が権限を表しています:
- 100644:通常のファイル(実行権限なし)
- 100755:実行可能ファイル(実行権限あり)
実際のファイルシステムの権限を確認(Linux・Mac)
ls -l deploy.sh
結果の例:
-rwxr-xr-x 1 user group 128 Dec 11 10:00 deploy.sh
先頭の-rwxr-xr-xが権限を表しています:
- rwx:所有者の権限(読み・書き・実行)
- r-x:グループの権限(読み・実行)
- r-x:その他のユーザーの権限(読み・実行)
権限変更を無視する設定
「開発環境で権限が勝手に変わっちゃって、毎回変更として検出されて困る…」
そんなときは、Gitに権限変更を無視させる設定があります。
リポジトリ単位で設定する
git config core.filemode false
このコマンドを実行すると、そのリポジトリでは権限変更がGitに追跡されなくなります。
全リポジトリで設定する(グローバル設定)
git config --global core.filemode false
--globalオプションを付けると、あなたのすべてのGitリポジトリで権限変更が無視されます。
設定を確認する
現在の設定を確認したいときは:
git config core.filemode
falseと表示されれば、権限変更が無視される設定になっています。
注意点
この設定は慎重に使いましょう。
- 実行権限が必要なスクリプトを扱うプロジェクトでは、権限管理が重要です
- 本番環境で動かすスクリプトは、必ず実行権限を正しく設定しておく必要があります
- チーム開発では、他のメンバーと設定を合わせておくことが大切です
セキュリティの観点から、chmod -R 777(すべてのファイルにすべての権限を付与)のような危険な設定は避けましょう。
よくあるトラブルと解決方法
トラブル1:Windowsで作ったスクリプトがLinuxサーバーで動かない
症状: Linuxサーバーにデプロイしたら「Permission denied」エラーが出る
原因: Windowsで作成したファイルには実行権限が付いていないため
解決方法:
git update-index --chmod=+x スクリプト名
git commit -m "実行権限を追加"
git push
サーバー側でgit pullすれば、実行権限が反映されます。
トラブル2:git pullしたら権限が変わってしまった
症状: git pullやgit cloneをしたら、ファイルの権限が全部変わってしまった
原因: Windowsなど、ファイルシステムが異なる環境でクローンした
解決方法:
# 権限変更を無視する設定にする
git config core.filemode false
# 権限の差分をリセット
git diff
# 何も表示されなくなる
トラブル3:権限だけ変わって「ファイルが変更された」と出る
症状: git statusで大量のファイルが変更扱いになっているが、内容は変わっていない
原因: 権限だけが変更されている(よくあるのはchmodを間違えて実行した場合)
解決方法1: 権限変更を無視する
git config core.filemode false
git status
# ファイルが表示されなくなる
解決方法2: 権限を元に戻す
# すべてのファイルを644に戻す(通常のファイル)
find . -type f -exec chmod 644 {} \;
# ディレクトリは755に戻す
find . -type d -exec chmod 755 {} \;
トラブル4:GitHub Desktopで権限が反映されない
症状: git update-indexで権限を変更したのに、GitHub Desktopでコミットすると権限が元に戻る
原因: GitHub DesktopがWindows環境で権限変更に対応していない
解決方法: コマンドラインから操作する
git add ファイル名
git update-index --chmod=+x ファイル名
git commit -m "実行権限を追加"
git push
GitHub Desktopではなく、Git Bashやコマンドプロンプトから実行しましょう。
複数ファイルの権限を一括変更する方法

たくさんのスクリプトファイルがある場合、一つずつ変更するのは大変ですよね。
すべての.shファイルに実行権限を付与(Linux・Mac)
# .shファイルを探して実行権限を付与
find . -name "*.sh" -exec chmod +x {} \;
# 変更をステージング
git add .
# コミット
git commit -m "すべてのシェルスクリプトに実行権限を追加"
Windowsで複数ファイルに実行権限を付与
PowerShellを使う場合:
# .shファイルを探して実行権限を付与
Get-ChildItem -Recurse -Filter *.sh | ForEach-Object {
git update-index --chmod=+x $_.FullName
}
# コミット
git commit -m "すべてのシェルスクリプトに実行権限を追加"
Git Bashを使う場合:
# .shファイルを探して実行権限を付与
find . -name "*.sh" | while read file; do
git update-index --chmod=+x "$file"
done
# コミット
git commit -m "すべてのシェルスクリプトに実行権限を追加"
pre-commitフックで自動化する
「毎回権限を設定するのは面倒…」という場合は、コミット前に自動で権限を調整する仕組みも作れます。
.git/hooks/pre-commitファイルを作成
#!/bin/sh
# .shファイルには自動的に実行権限を付与
find . -name "*.sh" -type f | while read file; do
git update-index --chmod=+x "$file"
done
exit 0
このスクリプトを.git/hooks/pre-commitとして保存すれば、コミット時に自動的に.shファイルに実行権限が付与されます。
注意: .git/hooksディレクトリはGitで管理されないので、チームメンバーそれぞれが設定する必要があります。
まとめ:環境に合わせた権限管理を
Gitでの権限変更、理解していただけましたでしょうか?
ポイントをおさらいしましょう:
- Windowsでの権限変更:
git update-index --chmod=+x ファイル名 - Linux・Macでの権限変更:
chmod +x ファイル名→ 自動的にGitが追跡 - 権限の確認:
git ls-files --stage ファイル名で確認 - 権限変更を無視:
git config core.filemode false - クロスプラットフォーム開発:Windows→Linuxデプロイ時は特に注意
開発環境とデプロイ先のOSが違う場合、権限の問題は避けて通れません。
でも、今回紹介した方法を使えば、権限トラブルから解放されて、スムーズな開発ができるはずです!
特にチーム開発では、権限の扱い方をドキュメント化しておくと、みんなが同じ方法で作業できて便利ですよ。
権限設定は一度理解してしまえば簡単なので、ぜひ実際に試してみてくださいね。


コメント