GitのメンテナであるJunio C Hamano氏が、最新リリースのバージョン2.25を発表した。前回の2.24から、500を越える変更が行われている。最も注目すべきなのは、スパース(sparse)チェックアウトを管理する新しいコマンドが追加されたことだ。これは、大規模あるいはモノリシックなレポジトリで特に有用である。
スパースチェックアウトは、Gitを使って大規模なレポジトリで作業する場合のパフォーマンスを向上するアプローチのひとつである。特に有用なのは、例えば数千のディレクトリを含むレポジトリで作業する場合で、キープするディレクトリを指定することによって、自分のワーキングディレクトリをクリーンに保つことが可能になる。
スパースチェックアウトはかなり前から使用可能であった機能だが、ほとんどコンフィギュレーションファイルの背後に隠されていた。しかしGit 2.25では、専用のsparce-checkout
コマンドが用意されて、init
、list
、get
、enable
、disable
サブコマンドが使用できるようになった。
実際には、スパースチェックアウトの使いみちは限られている。ワーキングディレクトリを混乱させないのは事実だが、フルクローニングが必要なことには変わりなく、ダウンロード時間やディスクスペースを大量に消費する可能性があるからだ。しかしながら、そのスパースチェックアウトを完璧に補完するものとして、Git 2.24で導入されたパーシャル(partial)クローンのサポートがある。
"パーシャルクローン"は、リポジトリを完全にコピーしなくてもGitを動作可能にする、パフォーマンスの最適化機能である。この開発の目標は、極端に大規模なレポジトリをGitがうまく処理できるようにすることだ。
パーシャルクローンでは、ユーザが関心を持たないオブジェクトのダウンロードのダウンロードによって課される通行料を回避する、という問題に対処しようとしている。不要なオブジェクトとは、例えば、ユーザが使用する予定のないファイルやディレクトリ、参照されることのない過去バージョンのバイナリアセットなどである。シャドークローンや単一ブランチのクローンとは異なり、パーシャルクローンはDAGレベルの動作ではなく、フェッチするオブジェクトを制限するフィルタを指定することで動作する。例えば、
git clone --filter=blob:none <repo> # omits all blobs
git clone --filter=blob:limit=Nm # omits blobs larger then N MB
パーシャルクローンはまた、ユーザが未取得のオブジェクトにアクセスした時に、それを提供するためのメカニズムも備えている。このことからパーシャルクローンは、時間の経過により大きなものに成長する可能性がある。ここでスパースチェックアウトを使用することにより、ユーザが関心のあるファイルを明示的に取り出すことが可能になるのだ。例えば、ひとつのディレクトリだけをリポジトリ上の過去ファイルとともに取り出して、その他はすべて無視したい場合は、次のように実行すればよい。
git clone --filter=blob:none <repo>
cd <repo>
git sparse-checkout init
git sparse-checkout set <path-to-directory>
実際にgit sparce-checkout set
では、.gitignore
と同じような方法による汎用的なファイルパターンの設定をサポートしている。この方法には欠点もある — このようなパターンが多数になると、除外するパスを判断する処理が計算能力上、高価なものになる可能性があるのだ。この問題は、git config core.sparceCheckoutCone
でGitの"cone"モードを指定することによって、ある程度解決することができる。このオプションは、スパースチェックアウトで指定可能なパターンを制限する。スパースチェックアウトはごく初期の試験段階であるため、主要なGit-in-theCloudプロバイダではサポートされていない。パーシャルクローニングとスパースチェックアウトに関する詳細な議論については、GitHubブログのこちらのイントロダクションを参照してほしい。
前述のように、Git 2.25には多数の変更があり、パフォーマンス改善やUIとワークフローの改善、バグ修正なども含まれている。その全容を短い記事でお伝えすることが難しいので、詳細部分に興味をお持ちならば、オフィシャルリリースの発表をぜひ確認して頂きたい。