位置情報がある写真を公開する前に警告

先日のブログに載せた写真、 調べてみたらジオタグで撮影箇所の緯度・経度が埋まったままでした 🤦‍♂

さすがに自宅の場所を公開したくはないので、 Git リポジトリから元の写真を削除し、 ジオタグを削除したファイルで置き換えました。 また再発防止のため、 位置情報がある写真をコミットする前に警告を出すように設定しました。

仕事以外で、 たまに Apps Script とか、 こういう小さなツールを書くのは楽しいですね。

Git リポジトリから写真を削除

Git リポジトリから削除する方法に関しては、 こちらの記事を参考にしました。

% git rebase -i 問題のコミットの直前のハッシュ値

これでエディタが開き、 問題のコミットから最新のコミットまでどうするかを聞かれるので、 問題のコミットだけ edit にして残りは pick のままにしておきます。

ファイルを保存してエディタを閉じると、 指定したコミット直後の状態になっているので、 画像を削除して rebase を継続します。

% git rm 位置情報入りの写真.jpg
% git rebase --continue

GitHub にあるリポジトリとローカルリポジトリが不整合になるため、 ローカルリポジトリのデータで強制的に上書きします。

% git push -f

(なお、複数人で開発しているときにこれをやるとリポジトリを壊します)

位置情報がある写真に対して警告を出す

Git は commit 直前にスクリプトを走らせる機能があるので、 これを使って、 追加・変更されたファイルにジオタグが埋まっていないかをチェックします。

_tools/check_geotag.py

まずは Python を使って、 簡単なスクリプトを作成。

  1. git diff を使って、変更されたファイルの一覧を取得
  2. 変更されたファイルが JPEG ファイルだった場合、exiftool という外部コマンドを呼び出して EXIF データを取得。
  3. EXIF データに位置情報があるか調べる。

テストの際には git diff の出力を使っていると面倒なので、 コマンドラインから写真のファイル名を指定できるようにしてあります。

_tools/test

関数レベルでの単体テストと、 あとは実際の画像ファイルと exiftool を使ってスクリプトの終了コードを調べるテスト。

また mypy を使って、 Python スクリプトに対して静的型検査を行っています。

post-commit

git commit 実行時に上記の Python スクリプトが実行されるように、 .git/hooks/post-commit ファイルを作成します。

.git 以下のファイルは Git で管理できないので、 開発中のスクリプトは _tools/hooks に置いて、 最初の一回だけ手作業でコピー。 二度目以降は、 post-commit が自動的に最新版をコピーしてくるようにしました。

参考: pre-commitをGitで管理する

README

使い方を忘れそうなので、 最後に README を書いて終了。

備考: mypy のインストール方法

get-pip.py を Python Packaging Authority から入手。

% python3 get-pip.py  --user
% export PATH=$HOME/.local/bin:$PATH # ~/.bashrc に追記しておく
% pip3 install mypy