Gitメンテナンスをバックグラウンドに移動して、ディスク上のリバースインデックスを追加したGit 2.31は、なじみ深いこのツールをよりユーザフレンドリにすると同時に、フェッチやプッシュといった通常動作をさらに高速化することを意図したものだ。
さまざまなツールの持つ自動クリーニング機能は、多くの場合において私たちの手間を大幅に省いてくれるが、一方ではGitのガベージコレクションに通常の作業フローを妨げられて、ターミナル画面をしばし見つめることになるという、どうしようもない時間も存在する。Gitの場合、この状況は次のようなメッセージで通知される。
パフォーマンス最適化のため、リポジトリの自動パッキングを実行します。"git gc"を実行して、手動で行うことも可能です。詳細は"git help gc"で確認してください。
これが起きると、その時に何をしていたかに関係なく、しばらく待つことになる。このようなGitのメンテナンス処理が重要であることは言うまでもないが、バージョン2.31からは新たなオプションとして、git background maintenance が用意された。この新機能は、インタラクションをブロックすることなく、リポジトリの健全性を維持することを可能にしてくれる。
インタラクションをさらに効率的にするため、Gitでは、効率向上を目的として事前定義されたアクションを用意しており、リモートリポジトリから最新のオブジェクトをプリフェッチして、1時間に1回、コミットグラフファイルを最新のものにしたり、ルーズオブジェクトのパックやパックされたオブジェクトをインクリメンタルに再パックする作業を毎日実行してくれる。この機能を詳細に理解するには、資料を読んで頂きたい。
Gitでは、コミットやツリーやblobといったすべてのデータを"オブジェクト"として保持し、そのコンテンツを個別のファイルにストアする。格納処理の改善のため、多数のオブジェクトがパックファイルに格納される。パックファイルの本質はオブジェクトの連結ストリームだが、個々のオブジェクトに効率的なアクセスを行うため、各パックファイルにインデックスファイルが生成される。このような方法で、オブジェクトのIDからパックファイル内のバイトオフセットを短時間に見つけることができるのだ。
リバースバインディング — パックファイル内のロケーションと各ロケーションに含まれるオブジェクトの間のマッピングで、リバースインデックスと呼ばれる — は、従来はオン・ザ・フライで計算されていた。今回のバージョン以降、これらのマッピングは、オブジェクトとポジションのペアをポジションでソートした配列を格納した、ディスク上の .rev ファイルから取得できるようになる。
事前に計算されたリバースインデックスを使用することで、オブジェクトのバイトデータをディスクから直接、より早く送信することが可能になるため、フェッチやプッシュ操作の高速化に寄与する。
.revファイルは現時点ではデフォルトで生成されないが、次のコマンドを実行して有効にすることができる。
git config pack.writeReverseIndex true
その上で、リポジトリを再パッキング (git repack -Ad) すればよい。