Gitで権限変更する方法を徹底解説!Windowsでも使える完全ガイド

プログラミング・IT

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 addgit 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 pullgit 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での権限変更、理解していただけましたでしょうか?

ポイントをおさらいしましょう:

  1. Windowsでの権限変更git update-index --chmod=+x ファイル名
  2. Linux・Macでの権限変更chmod +x ファイル名 → 自動的にGitが追跡
  3. 権限の確認git ls-files --stage ファイル名で確認
  4. 権限変更を無視git config core.filemode false
  5. クロスプラットフォーム開発:Windows→Linuxデプロイ時は特に注意

開発環境とデプロイ先のOSが違う場合、権限の問題は避けて通れません。

でも、今回紹介した方法を使えば、権限トラブルから解放されて、スムーズな開発ができるはずです!

特にチーム開発では、権限の扱い方をドキュメント化しておくと、みんなが同じ方法で作業できて便利ですよ。

権限設定は一度理解してしまえば簡単なので、ぜひ実際に試してみてくださいね。

コメント

タイトルとURLをコピーしました