Gitでコミット前にパーミッションを変更するサンプル
ちょっとした相談があって、タイトルのようなことをしたのでメモ。
Gitはhookという仕組みがあって、コミットの前、などいくつかのタイミングで任意のスクリプトを実行することができる。
このhookを利用してコミット前に更新対象が画像ファイルの場合はパーミッションを変更する処理を自動で実行するようにしてみた。
まず、hookスクリプトを用意する。
チームメンバーなど、関係者全員で共有したいので、.githooks
というディレクトリを作成してそこにpre-commit
というファイル名でスクリプトを以下のように作った。
今回はパーミッションの変更をしているけど、この対象ファイルを抽出して何かの処理を挟み込むパターンはパーミッションに限らず他にもいろんなことに応用できそう。
#!/bin/sh
# 画像ファイルはgit commit する直前に自動でパーミッションを644に設定する
list=`git status | gawk 'match($0, /(modified|new\sfile):\s\s(.*(\.png|\.jpe?g|\.gif|\.webp))/, a) {print a[2]}'`
for FILE_NAME in $list; do
chmod 644 $FILE_NAME
git add $FILE_NAME
echo "file permission changed. $FILE_NAME"
done
あとはデフォルトのhookの実行ファイルは.git/hooks
配下なんだけど、これを.githooks
配下に変更したい。
以下のようにコマンドを実行することでhooksの各場所を変えることができる。
$ git config --local core.hooksPath .githooks
以下みたいに.githooks
と出れば向き先が変わっている。
このgit config〜
は最初みんなにやってもらう必要がある。
$ git config --local core.hooksPath
$ .githooks
あとは、それぞれ実行権限を付与してリポジトリにアップしておきましょう。これでみんなが使えます。
$ chmod -R +x .githooks
$ # あとはgit commit なり pushなり
Google Driveなどから画像ファイルをコピーしてくるとなぜか実行権限が付与されてコピーされてしまうことがあるみたい。
不必要に実行権限を保持したくないので、今回のような対処を行いました。
この記事の環境情報
- git 2.38.1
- shell芸人に私はなりたい
Gitに関する他の記事を読む
最近の記事を読む
- Flutterでcontextを使わずにlocale情報を取得する
- Cloud RunでIAPを有効にしようとしてハマったこと
- slimでtype='application/ld+json'のscriptタグを書く
- タグマネージャーでjsのloadイベントを発火させたいとき
- mysqlコマンドを実行してERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)と言われたら