私が勤めている会社ではWIndowsとMacを使っています
先日、WIndowsとMacでファイルの権限(パーミッションといいます)でトラブルが起こったので今回はそちらについて記事にしたいと思います。
今回のテーマとなる問題
冒頭で書いたように勤務している会社ではWindowsとMacでプログラムを書いています。
そして過去の記事に書いているのですがGitも使っています。
WindowsとMacを使っている会社でGitを使っていると、ある問題が発生することがあります。
それはファイルパーミッションの差分が出てきてしまうという問題です
「うちもWindowsとMacどちらも使ってGitも使っているけど起きたことがないよ」という人もいると思います。
この問題が起きるのはMacでファイルパーミッションを 755 に設定して Git に push したものをWindows に落としてきた時に発生します。
原因
そもそもなぜ大量の差分が出てきてしまうのかというとファイルシステムが違うからです。
同じパソコンでもMacとWindowsでは操作方法やソフトが違うのと同じようにファイルを管理する方法も違います。

こちらのページを見ても分かるように
Macでは ReadWrite eXec についてを誰につけるかを決めるに対して、
Windowsでは フルコントロール、変更、読み取りと実行、…を付けていく形式です。
この権限の違いを共通化することは難しいため、Gitを扱う時、以下のような状態になります。




GitはUNIX系のファイルパーミッションで管理されています。
Git上ではMacのパーミッションを正しく保存するため、Git上では755になっています。
しかし、Windowsではその別のファイルシステムで管理されているため、WindowsでMacで755に変更したファイルをpullしてきてもパーミッションが644になってしまいます。
そのため、WindowsでGitを使い、パーミッション755のファイルを落としてくると、「パーミッションが755から644に変更されました」という差分が出てきてしまいます。
対応策
WindowsのGit Bash などGitコマンドを打てる場所で、
git config core.filemode false
を実行します。
または、gitで管理しているフォルダの一番階層が浅い場所に .git という隠しフォルダがあるので、.gitの中の config に filemode = false を追加します。
[core]
︙
filemode = false
︙
現在の設定を確認するときは
git config --list | grep core.filemode
で core.filemode の状態を確認できます。
解説
core.filemode = false にすることで、 Git でファイルのパーミッションをチェックしないようにしています。




そのため、WindowsのGitで差分を見てもファイルパーミッションの差分は出てきません。
「これで問題ないのか?」と思ってしまいますが、前述したとおり、644という形式のパーミッションを使っていないため、644は実行権限が付いていないことを表しますが、関係なくファイルを実行することが出来ます。
なお、Windowsから755権限のファイルを編集してpushする場合は、パーミッションを無視して編集内容のみpushされます。
注意しなければならないこと
この対応はMacで作った755権限のファイルをWindowsに入れた時に行います。
Macでcore.filemode = false は行わないでください




理由はこの図のように core.filemode = false になっているとGit上に差分が反映されず、一緒に開発を行っているメンバーに正しいパーミッションを共有できないためです。
デフォルトでは core.filemode = true になっているはずですが、開発現場によってはWindowsとMac間でOSをまたいでコピーを行うこともあるかもしれません。




その際は、.git/configの設定が各OSに適したものになっているかをよく確認しましょう。
まとめ
ネットで調べると、多くの記事で
意図しないファイル差分が出てきたら git config core.filemode falseを実行しよう
という回答が出てきます。
答えはこれで合っていますが、情報が足りてない記事が多いです。
何も理解しようとせずに実行すると、思わぬところでパーミッションの不整合が発生して、一緒に開発しているメンバーに迷惑を掛けてしまいます。
今回は、ファイルシステムとGitに関しての話でしたが、似たようなケースはたくさん出てきます。
「ネットで出てきた方法をやったら解決出来たけど、説明できない」は今後のトラブルの元になるので気をつけましょう!
ここまで読んで頂きありがとうございました!
コメント