40
35

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Windowsローカル開発環境からgit commitする時にはパーミッションに気を付けること

Last updated at Posted at 2017-12-29

背景

railsdelay_jobwheneverを実装し、ローカル開発環境では問題なくジョブが走った。

しかし本番環境にデプロイ後、ジョブが走らなかった。

エラーログを確認したところrailsbinディレクトリ以下の各ファイルの権限が644となっており、実行権限がないことが判明。

だとしたら、ローカル開発環境でも動かないはずだろ??
そんな思いからいろいろ調べてみた。

windows環境でのgitbashはchmodが効かない!!

chmod 777 ファイル名してもchmod 644 ファイル名してもchmod o+w ファイル名しても何しようが権限が変更されない。
大丈夫!
これはwindowsの仕様の問題らしい。
なのでスッキリあきらめよう!

https://gyazo.com/f912264b59cdfac8862cc6436272b47e

git addするとパーミッションが自動的に変更され644になってしまう!!

これはgitの仕様。
おそらくですが、大規模開発を想定し、ファイルパーミッション管理の保守性を向上させているのでは?と自分なりに理解してみる。。

以下のように.git/configfilemodeがデフォルトでfalseになっていると、パーミッションを変更してもgit addすると644になってしまうのです。

https://gyazo.com/83a6ef8926aa054ecdc96fb2a8ea59a4

では、どうやってパーミッションを変更するのか?

例えば、test.rbに実行権限を付与したいときは以下のコマンドを実行する必要があります。

git update-index --add --chmod=+x test.rb

update-indexのインデックスってなんだ?

ここでgit update-indexindex(インデックス)ってなんだ?という疑問が沸きます。

インデックスはgit addした時にファイル状況が保存される領域のことです。

  • git add ワーキングツリー → インデックス
  • git commit インデックス → ローカルリポジトリ
  • git push ローカルリポジトリ → リモートリポジトリ

という感じです。
つまり、インデックス領域に対して権限変更処理を実行しておけばコミット先で644に変更されないというgitの仕様が存在しているのです。

ではインデックス上での権限変化をどのようにして確認するのか

残念ながらwindows環境だと、ls -laしても変化は確認できません。
(chmodが機能しないので、権限を変更させられないという方が正しい言い回しかもしれないです。)
(Windowsの仕様なので、ここはあきらめましょう!)

https://gyazo.com/40e3f6959139f93a1a0ee0aa2ff1e48b

ではどうやって権限変化を確認するのか?
以下のような流れで確認します。

  1. 該当ファイルをgit addしてインデックス領域に入れて置く。
  2. 1.を実行するとgit ls-files -sでインデックス内のファイルの権限を確認できます。実行してみるとこの時点では644になっています。
  3. git update-index --add --chmod=+x test.rbして実行権限を付与。
  4. 改めてgit ls-files -sでインデックス内のファイルの権限を確認。
  5. しっかりと644755になっていることがわかります。(さらにgit update-index --addでは所有者、グループ、ユーザすべてに働きかけていることも分かります!)

https://gyazo.com/7075169d6c852f03092aab1ff70447b5

まとめ

つまりローカル開発環境でジョブの実行がうまくいったのは、ワーキングツリー上で確認できるよう、実行権限が付与されているため。
その後git addすることでパーミッションが644に変更してしまったので、それをもとにコミット、デプロイしている本番環境ではジョブが実行されなかったという事なのです。

長々と話しましたが、実行権限をつけておくべきファイルに対しては、git update-index --add --chmod=+x ファイル名を忘れないようにしましょう。

特に本番環境適用時には注意しましょう!

40
35
1

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
40
35

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?