3月15日、Git プロジェクトから Git 2.49 がリリースされた。

今回のリリースにおける主な新機能や改善点は以下の通り。
- name-hash v2 によるパッキングの高速化
- パーシャルクローンでの履歴オブジェクト一括取得(backfill)
- zlib-ng のサポート
- Rust コードの導入
git gc --expire-to
のサポートhelp.autocorrect
の動作改善git clone --revision
オプションの追加- Git 3.0 に向けた互換性関連の変更
以下に、その内容を簡潔にまとめて紹介する。
1. name-hash v2 によるパッキングの高速化
Git はリポジトリに溜まったオブジェクト(コミットやツリー、ファイルのスナップショットなど)をより効率よく保存するために、「パックファイル」という形式を使うことがある。パックファイルを作る作業は git gc
や git repack
で行うが、その際のオブジェクト圧縮や整理をどう行うかが、リポジトリの容量や操作速度を大きく左右する。
この「パッキング」の処理において、従来の “name-hash” という仕組みをバージョンアップし、name-hash v2
を導入した。これはファイルパスのどの部分を重視してグルーピングするかを最適化し、圧縮効率やパックファイル作成速度を改善する。たとえば、リポジトリの中に同名のファイルが多数ある場合などに圧縮が有利になり、結果としてディスク使用量を削減したり、git repack
の実行速度が向上したりする。
2. パーシャルクローンでの履歴オブジェクト一括取得(backfill)
Git の **パーシャルクローン (git clone --filter=blob:none
など) ** は、リポジトリのすべてのデータを取得せず、必要なものだけをダウンロードする仕組み。履歴をいちいち引っ張ってこないため、クローンの初期コストを抑えられるが、過去のバージョンのファイルを参照するときに毎回サーバーへ問い合わせが発生する点が悩みだった。
この課題を解消するため、 新たに git backfill
コマンドが追加 され、特定のパスに関連する過去のオブジェクトをまとめてダウンロードできるようになった。たとえば、git blame
で古い履歴を辿りたいときに、一気に必要なバージョンを取得してくれる。これにより、断続的にオブジェクトを受信する手間が減り、ネットワーク負荷や待ち時間の削減が期待できる。
3. zlib-ng のサポート
Git はリポジトリ内のオブジェクトを zlib というライブラリで圧縮している。zlib は歴史が長く、さまざまなシステムで使われているが、より高速化を追求するフォークとして “zlib-ng” というバージョンが存在する。
Git 2.49 では、この zlib-ng をオプションとして利用できるようになった。zlib-ng には最新の CPU 命令を活用した高速化が組み込まれており、ビルド時に指定するだけで、オブジェクト読み書きの速度が向上する可能性がある。ただし、ソースからのビルドが必要な場合もあるため、環境によっては少し上級者向けの設定といえる。
4. Rust コードの導入
最近はさまざまなプロジェクトで安全性や高パフォーマンスを得るために Rust が採用されているが、Git もその流れに乗り、 Git 本体の一部コードが Rust で実装され始めた。 いきなり大部分が Rust になるわけではないが、今後の拡張や改善でセキュリティや安定性が向上する可能性がある。普段使っている人にはあまり見えない変更だが、内部の品質向上の一環として要注目だ。
5. git gc --expire-to
のサポート
git gc
はリポジトリの不要なオブジェクトを片付けるコマンド。これまで、到達不能(参照されていない)オブジェクトを消すのか、別の場所に移すのかといった細かい設定は git repack
で行う必要があった。
これらのオプションを git gc
でも指定できるようになった。不要オブジェクトをすぐ削除せず、一時退避しておきたい場合などに便利で、リポジトリの安全性やバックアップ戦略の幅を広げる機能だ。
6. help.autocorrect
の動作改善
Git には、打ち間違えたコマンドを推測して補正してくれる help.autocorrect
という機能がある。ただ、設定によっては補正までの待ち時間がほとんどなく、気づかないうちにコマンドが実行されてしまうという問題があった。
この help.autocorrect
に “1” を設定すると「補正を有効」にするだけで、即時実行しなくなった(従来は 0.1 秒後に即実行されてしまう仕様)。誤爆を防ぎやすくなり、より使いやすい補正機能になっている。
7. git clone --revision
オプションの追加
従来git clone
には --branch
や --tag
を指定して特定のブランチ・タグをクローンできるオプションがある。しかし、ブランチやタグが貼られていないコミットを直接クローンしたい場合は少し手間がかかっていた。
今回から新たに --revision
が追加され、ブランチやタグに紐付いていないコミットでも指定してクローンできるようになった。特定の履歴ポイントだけを取り出したいときに便利で、手作業で fetch する必要がなくなる。
8. Git 3.0 に向けた互換性関連の変更
Git は長い歴史の中で、古い設定方法や機能を互換性維持のために残してきた。今後リリースされる Git 3.0 では、そうしたレガシー要素を大胆に整理する予定だ。
Git 2.49 では、この移行をスムーズに進めるために、古い機能をコンパイル時に除外できるオプションなどが追加されている。既存ユーザーが乗り換えやすいよう、段階的に準備が進められているわけだ。
まとめ
Git 2.49 は、日常的に Git を使うエンジニアにとっても、実際の作業をスムーズにしてくれる機能が多数含まれるリリースとなっている。パフォーマンス向上や操作性の改善だけでなく、将来的なメジャーバージョンアップへの布石となる変更も多い。各機能の詳細は公式リリースノートやドキュメントを参照のうえ、導入やアップデートを検討してみてほしい。