ほげほげー

C#メインにプログラミング周りから日常のあれこれとかを不定期に書いていきます。

Windows で git へのコミット時に実効権限(Permission)を付与する

Windows で作業して Jenkins 上でビルドする、とやっているとたまに権限がダメで毎度毎度やり方をググっているので備忘録に。

背景

Linux 系の上で作業している場合は chmod を追従してくれるようなので問題ないが、Windows 上で作業した場合はその限りではなく、git コマンドを使って Permission を指定する必要がある。
未指定の場合は 644 となり、実効権限が無い状態となるため、.sh 等の実行ができない。

git for Windows のデフォルトでは filemode 設定が false となっているはずなのでチェックアウトするだけで差分が出る、といったことはありませんが、もしチェックアウトするだけで権限の差分が出る場合は以下のコマンドで filemodefalse にしましょう。

# 現在の filemode 設定を確認する
git config core.filemode

# true になっていた場合は false に設定する(必要に応じてオプションを global にする)
git config --local core.filemode false

基本的にこの設定は Windows 以外で使うことは無いと思いますので、MacLinux 等で作業している場合は true で良いはず。

git 上に保存されている状態を確認する

ls-files-s オプションを利用する事で確認できる。

git ls-files -s [target file path]

[target path] を省略すると現在のディレクトリ以下のファイルの状態が再帰的に全て列挙される。

git に Permission 情報をコミットする

update-index--chmod オプションを利用します。

git update-index --chmod=+x [target file path]

これで実効権限が付与された状態で stage されるので、後は commit したら対応完了。

なお、このコマンド自体は chmod の名に反して細かい権限設定はできず、実効権限の +x -x しか指定できません。