ちょっとした相談があって、タイトルのようなことをしたのでメモ。

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芸人に私はなりたい