検索
ニュース

「Git 2.44」新機能のハイライトをGitHubが解説マルチパックの再利用によるパック生成の高速化など

オープンソース分散バージョン管理システムの最新版「Git 2.44」が公開され、GitHubが新機能のハイライトを解説した。

Share
Tweet
LINE
Hatena

 Gitプロジェクトは2024年2月23日(米国時間)、オープンソースの分散バージョン管理システム「Git」の最新版となる「Git 2.44」を公開した。

 Git 2.44では、UI(ユーザーインタフェース)やワークフロー、機能、パフォーマンス、内部実装、開発サポートなどが強化されており、バグも修正されている。GitHubは、公式ブログでGit 2.44の新機能のハイライトとして、マルチパックの再利用によるパック生成の高速化や、「git replay」コマンドによるリベースの高速化などについて解説した。概要は以下の通り。

マルチパックの再利用によるパック生成の高速化

 Git 2.44では、複数のパックにわたってオブジェクトを再利用できるようになった。

 Gitは、オブジェクトをクライアント(フェッチ/クローン時)、サーバ(プッシュ時)、または自身(再パック時)に送信する際、転送されるオブジェクトのセットを含むパックファイルを生成する必要がある。そしてこのパック内のオブジェクトの多くを開いて解析し、既存オブジェクトとペアにしてデルタチェーンを形成しようとする。

 この処理を繰り返すことで、パックファイルの生成が効率化される。Gitは、互いに似た内容を持つオブジェクトを見つけてペアリングし、容量を節約するからだ。少量のデータをGitHubにプッシュする場合、この作業は通常はごくわずかで、大した時間もかからない。だが、クローン作成中に、リポジトリ内の到達可能なオブジェクトを全てロードし、デルタ化すると、莫大(ばくだい)なコストがかかる。数万以上のクローンを作成する場合は特にそうだ。

 オブジェクトの転送に使われるワイヤフォーマットは、ディスク上の.packファイル($GIT_DIR/objects/packにある)と同じ表現を使っている。そこでGitは、クライアントに送信する新しいパックの生成時に、既存パックファイルの一部をバイト単位で再利用できる。

 ただし、従来は、この機能を最大限に活用するには、リポジトリがオブジェクトの大部分を単一のパックファイルにまとめておき、そこからオブジェクトを再利用する必要があった。多くのリポジトリでは、これは大きな問題ではないが、何億ものオブジェクトを含む大規模リポジトリでは、法外なコストがかかる。

 Git 2.44では、到達可能オブジェクトビットマップを用いたマルチパックインデックス(MIDX)を使う場合、複数のパックからオブジェクトを再利用することで、パック生成にかかる時間を改善できるようになった。

 この機能を利用するには、ローカルにインストールしたGitをアップグレードし、次にGitHubにプッシュする前に、以下を実行する。

$ git config --global pack.allowPackReuse multi
$ git multi-pack-index write --bitmap

「git replay」によるリベースの高速化

 リベースに使われてきた「git rebase」コマンドは、最近一から書き直されたマージバックエンドである「merge-ort」との統合が難しく、下位互換性の保証を破らなければ、パフォーマンスを阻害すると考えられる。その原因は、これまでのさまざまな設計上の決定事項や前提だ。

 これらの課題に対処するために、git rebaseの代替となる「git replay」が導入された。git replayは、はるかにパフォーマンスが高い他、以下のような特徴も持つ。

  • ベアリポジトリで動作する
  • 現在チェックアウトしているブランチ以外のブランチをリベースできる
  • 複数のブランチで同時に動作する

 なお、merge-ortは、かなり前からGitに導入されており、Git 2.34以降、既定のマージバックエンドとなっている。

git rebaseの「--autosquash」オプション

 これまで「--autosquash」(自動スカッシュ)オプションは、「git rebase --interactive」(またはgit rebase -i)を使った対話型リベースにしか対応していなかった。

 Git 2.44では、自動スカッシュが非対話型リベースでも機能するようになった。ただし、applyバックエンドとはまだ互換性がない。

「hint:」で始まるメッセージの表示

 これまで、「hint:」で始まるメッセージは全て、以下のように、それらをオフにする方法と併せて表示されていた。


(提供:GitHub)

 Git 2.44では、「git config advice.pushAlreadyExists true」を実行することで、オフにする方法の表示を省略できるようになった。

「git for-each-ref --no-sort」の再定義

 「git for-each-ref --no-sort」は、git for-each-refの出力である全ての参照を、アルファベット順にソートしていた。だが、特定の最適化を利用できるようにするため、出力を不特定の順序で表示するように再定義された。

「パススペック」の活用

 Gitの用語では、「パススペック」(pathspec)は主に、Gitコマンドとの組み合わせにより、「ファイルパスを制限する方法」を指している。

 Git 2.44 では、「git add」が「attr」パススペックマジックを理解するようになった。例えば「git add ':(attr:~binary)'」により、インデックス内の全てのテキストファイル/非バイナリファイルをステージングできる。

 また、「builtin_objectmode」という新しいパススペック属性も導入された。この新しいパススペックマジックは、モードによるパスのフィルタリングを可能にする(例えば、実行不可能なファイルは100644、実行可能なファイルは100755、サブモジュールは160000など)。プレフィックスの「builtin_」は、「.gitattributes」ファイルに値を設定しなくても、このパススペックマジックが使えることを示している。つまり、「git add ':(builtin_objectmode=100755)'」により、ワーキングコピーに全ての実行可能ファイルを追加するといったことが可能だ。

Copyright © ITmedia, Inc. All Rights Reserved.

ページトップに戻る