Git LFSが2.0になり、ロック機能とやらが実装されました。github.comではすでに使えるようになっています。GitHub Enterpriseでも、最新の2.10にはいつの間にか来ています。忍び寄るロック機能! GitLabとBitBucketはまだのようです。
Git!
なのに!
ロック!
まさにあれの再来ですよね。実際にこのロック機能を激しく使ってみたわけではないのですが、ソースコードを読んだりしてなんとなく概要を把握したのでざっと書いてみます。
一次情報は次のWikiですね。
ロック機能を有効にする
Git LFSの機能の一部ですので、Git LFSを有効化しますが、その時にオプションを付与します。
$ git lfs track "*.png" --lockable
この --lockable
がポイントです。
ちなみにこれを付けると、リポジトリ内のすべての該当ファイルがフルオートで 読み込み専用(444)になります 。ワクワクしてきますね!
なお、この情報は .gitattributes
ファイルに書き込まれます。テキストファイルなので自分でて修正もできますが、読み込み専用にするのがポイントっぽいです。
なお、Git LFSのファイルポインタ方式のバイナリデータ管理は使いたくないんだけど、ロックだけは可能にしたい場合は .gitattributes
ファイルを手修正して設定を追加すればいいらしいです。(上記のコマンドだとファイル変換のフィルタまで設定されてしまう)
*.yml lockable
ロック機能を使う
次のようにコマンドを実行します。
読み込み専用状態が「ロック状態」なのではなく、読み込み専用なのがデフォルト状態で「ロック状態」は自分だけにファイルの書き込み権限があるというステータスです。最初わかりませんでした。次のように実行すると、644となります。ロックというとあれですが、VSSのチェックアウトと考えれば、おっさんたちはピンと来ると思います。僕もピンと来ました。
$ git lfs lock sample.png
この状態で編集してコミットすればOKです。で、使い終わったら次のコマンドを実行します。
$ git lfs unlock sample.png
これでロック解除ができます。
ロックした人がそのまま風邪引いて会社来なくなったら?
FAQですね。次のように --force
で強制解除できるので、いざとなったら解除できちゃいます。あの「帰る前にきちんと忘れずにチェックインしないと!!!」というハラハラ・ドキドキは味わえません。残念。
$ git lfs unlock sample.png --force
複数人を調停する仕組み
積極的に「いまこのファイルがロックされているからお前に編集するなよ」みたいなのを通知するような機能はありません。
現在ロックされているファイル一覧は次のコマンドで取得できますが、すぱっと高速には帰ってこなくて、数秒かかっています。常駐して頻繁に呼び出してNotificationを出す、という感じではなさそうです。
$ git lfs locks
filesystem/filesystem.png shibukawa ID:1535
filesystem2/watcher.png shibukawa ID:1536
index.rst shibukawa ID:1534
ロックすると .git/lfs/lockcache.db
というファイルができます。git-lfsって独自のキーバーリューストアの実装を持っているんですね。そのファイル形式です。ですが、このファイルを何らかの形で同期をとったりとかはしてなくて、これはあくまでもローカルのキャッシュです。
実際には単純で、lockサブコマンドを実行したタイミングでサーバーの /locks
エンドポイントにファイルパスを送りつけて、ロックを作成します。同名ファイルを実行するとエラーになるので、早く実行したもの勝ちというただそれだけです。
実際には、Slack botかなにかで、ロック情報のイベントをgithubから取得して流してあげるだけでも体感上は必要十分な感じになるのかなって思います。
まとめ
ドキドキ・ワクワクはありませんが、バイナリファイルの編集のコンフリクトを避けるロック機能の紹介でした。