git-cryptを使えば、ファイルを暗号化してコミットしてチェックアウト時に復号化するという処理を透過的に(自動で)行えます。暗号化するにはGPG鍵が必要です。クローン時の復号化には基本的にGPG鍵ではなく対称鍵というのを使います。
暗号化
セットアップ
git-crypt init
これを実行すると~~.git-crypt
~~ .git/git-crypt
ディレクトリが作成され、そこに暗号化・復号化のためのメタデータが入ります。このディレクトリは.gitignore
してはいけません。
暗号化するファイルを指定する
echo '.secret filter=git-crypt diff=git-crypt' >> .gitattributes
以下のようになっていると思います。
.secret filter=git-crypt diff=git-crypt
1つめのフィールド.secret
の部分は、暗号化されるファイルの名前です。.gitignore
に書くときと同じように書けます。誤って.gitattributes
や.gitignore
などのファイルを指定して暗号化してしまわないようにしてください。また、暗号化したいファイルと同時かそれよりも前に、そのファイルのエントリを追加した.gitattributes
をgit add
してください。そうでないとそのファイルは暗号化されません。
git add .gitattributes
暗号化に使う鍵を指定する
git-crypt add-gpg-user USER_ID
USER_ID
の部分に、GPG鍵を特定できる文字列を入れます。フィンガープリントやメールアドレスなど、GPGのmanpageの "HOW TO SPECIFY A USER ID" にあるやり方で指定できます。
暗号化するファイルを追加する
echo 'hello, secret world!' > .secret
git add .secret
あとは普通にコミットしてプッシュすればOKです。おめでとうございます! 当該ファイルは暗号化されたのち送信されますし、ローカルでは生のまま扱えます。
復号化
基本的に自動で復号化されるので、ほとんど気にする必要はありません。特別な手順が必要になるのは、新たにクローンした時だけです。
秘密鍵を使う
git-crypt unlock
クローンしたリポジトリでこれを実行します。そのあとは、プルした時にいちいちアンロックする必要はありません。
対称鍵を使う
秘密鍵を持っていないマシンでも開発する場合や、共同開発者がいる場合などには、以下の手順が必要になります。
対称鍵を生成する
git-crypt export-key /path/to/key
GPGユーザ追加もしくはアンロックを行ったリポジトリでこのコマンドを実行し、生成されたファイルを別のマシンや共同開発者に送ってあげましょう。
対称鍵でアンロックする
git-crypt unlock /path/to/key
その他
- アンロックされたリポジトリでは、秘密鍵がなくても:
- 必要なときに自分で対称鍵を生成できるので、貰った対称鍵は削除しても問題ありません
- 新たなファイルを暗号化して追加できます
- TravisCIなどでテストする場合はどうするんでしょうか……