gitで管理するシェルの実行権限について
弊社では、Linuxサーバー上で使用するシェルをgitで管理しているのですが、Windowsで作業しているメンバーが「シェルに実行権限を付けた状態でgitにcommitできない」と言っていたので、調査をしてみました。
はじめは、「gitはファイル実行権限についてはリポジトリ管理していないのかな?」くらいに思って、はじめにファイル追加する時に設定した権限が活きてしまうのかと想定しました。
それで、自分の環境ですでに追加済みの"実行権限無し"のファイルに実行権限を与えて、git diff
を取ってみると
$ ls -al -rw-r--r-- 17:38 README.md $ chmod a+x README.md $ git diff diff --git a//README.md old mode 100644 new mode 100755
・・・普通に権限を認識していました。
git commit
も
$ git add README.md $ git commit -m 'chmod test' [master 006af9e1] chmod test 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 README.md
普通にできました。
なので、今まではシェルに権限が無い前提で、サーバー上でgit pull
する際に、シェルファイルに実行権限を与えるシェルでpullしていた(ややこしい)のですが、そのシェルで実行権限を与えた後にgit add
してgit commit
したら、リポジトリ 上で実行権限が付いている状態にできました。
そもそも何が問題だったのかを想像したのですが、
- Windowsでシェルに実行権限を付ける方法(私はMacで作業をしていました)
Gitでファイルの実行権限を変更する - Qiita - Windowsで
git pull
をすると、実行権限が剥奪されることがある(git config
のcore.filemode)
【Git】ファイルパーミッションの変更(chmod)を無視する方法 - Qiita
あたりの関連で、作業中に消えてしまったり、そもそも権限無しで上げてしまったりしていたのかなと思いました。