概要
Windows上でgit bashを使って開発している人向け。
パーミッション周りの面倒ごとをコマンド一つで解消したという内容です。
直面した問題
業務効率化のためにシェルスクリプトをゴリゴリ書いて、ローカル環境で問題無く動作したのでそのままcommit。しかし、いざ実環境(Linux環境)にデプロイして実行するとコケる、ということがそこそこありました。
なんでやと思ってデプロイしたスクリプトを確認すると、スクリプトのパーミッションが644となっており実行権限が無い状態となっていました。なので、権限が無いのに実行しようとしてたから怒られたというワケです。
Windowsではchmod
を使ったとしても、git add
の時点でパーミッションが644になってしまうようで、そのままcommitしちゃうと先の事象が発生しちゃうというカラクリです。Windowsをメインで使ってると、この辺あまり意識しないで開発進めてしまうので気を付けねば…。
やったこと
以下のコマンドを実行し、git add-755
という新たなコマンドを作成しました。
git config --global alias.add-755 '!git add $@ && git update-index --add --chmod=+x $@'
このコマンドは何をしているの?
gitにはエイリアス1という機能があり、任意のコマンドを別名で実行できるよう設定することができます。このエイリアスを用いて、パーミッション755の状態で対象ファイルをインデックス領域(git add
によって、commit対象となるファイルが保存される領域)に保存するコマンドを作成しました2。
作成したコマンドの使い方
コマンドに続けて、インデックス領域に上げたいファイルを指定します。
git add-755 hoge.sh
// 複数指定も可
git add-755 hoge.sh fuga.sh piyo.xml
インデックス領域でパーミッションを確認するコマンドはgit ls-files -s ファイル名
です。git add
とgit add-755
で対象ファイルのパーミッションが異なっていることを確認できると思います。
// デプロイするファイルの作成
$ vi test01.sh
// いつも通りgit addを実行する
$ git add test01.sh
// パーミッションを確認すると、644の状態でインデックス領域に保存されている
$ git ls-files -s test01.sh
100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0 test01.sh
// 一度unstageしたのち、作成したadd-755を実行
$ git add-755 test01.sh
// 再びパーミッションを確認すると、想定通り755の状態でインデックス領域に保存されている
$ git ls-files -s test01.sh
100755 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0 test01.sh
おわりに
パーミッションを755に変更する方法はググれば色々出てくるのですが、一発で変更できない上にコマンドが覚えにくいので、何度も調べたりして手間がかかっていました。エイリアスめちゃくちゃ便利なのでどんどん使っていきたいですね。
-
エイリアスに設定した元のコマンドについては、https://git-scm.com/docs/git-update-index や Windowsローカル開発環境からgit commitする時にはパーミッションに気を付けること を参考にしました。 ↩