詩と創作・思索のひろば

ドキドキギュンギュンダイアリーです!!!

git submodule をキャッシュで高速化する

目下新マシンの開発環境をセットアップ中なんだけど、clone しないといけないリポジトリがけっこうたくさんある。このリポジトリ群っていうのが git submodule によってモジュールを共有していて、つまり同じリポジトリを何度も fetch してくることになる。これって無駄じゃないですか?

というわけで submodule update 時にキャッシュを生成し、それを利用して以降の同コマンドを高速化するコマンドを書きました。

https://github.com/motemen/git-shared-submodule-update

git submodule update の代わりに使います。

# git submodule update --init の代わりに…
git shared-submodule-update --init

簡単ですね。

git submodule update の中で呼ばれる git clone には --reference <repository> というオプションがあって、これを指定すると git の持つデータの実体である object をローカルのリポジトリから借用することができます。つまり、リモートとの通信量をそのぶん減らせるわけですね。イメージ的には git 界におけるシンボリックリンクを張っているような状態です。なので借用先のリポジトリが消えたり git gc によって縮退したりすると借用元のリポジトリはぶっ壊れるわけですが、ここでさらに --dissociate というオプションを与えると、clone 後にシンボリックリンクを解消して実データを新しいリポジトリにコピーし、参照を切り離すことができます。

以上はちょっと細かい話でしたが、この仕組みを利用するために、clone 前にキャッシュ的なリポジトリを作っているだけです。実は5年くらい前に似ようなことをするやつを書いてたんだけど、ちょっと大げさすぎたので、そこから submodule 部分だけ切り出したかたちです。

以下は参考文献。