7 ポイント 投稿者 GN⁺ 2024-10-28 | 1件のコメント | WhatsAppで共有
  • Microsoftの大規模なJavaScriptモノレポである1JSは、コード量もコントリビューション量も非常に多い。最近クローンしたリポジトリは178GBに達していた。
  • リポジトリのサイズが大きすぎて、ヨーロッパの一部ユーザーはクローンできなかった。

教訓 #1

  • 数年前にリポジトリに参加したとき、リポジトリが急速に大きくなっていることに気づいた。最初にクローンしたときは1〜2GBだったが、数か月後にはすでに4GBに達していた。
  • git-sizer ツールを使って大きなblobを確認したところ、これはバイナリが誤ってチェックインされたときに発生していた。Azure DevOpsのチェックインサイズ制限機能を使うことでこれを防げる。
  • Beachballの変更ファイルを削除していなかったことが問題を引き起こしていた。これはChangesetsと同様に、パッケージのsemver範囲を自動的に引き上げるために使われる。
  • 1つのフォルダに何千ものファイルを保管してはいけない、という教訓を得た。これを解決するため、Beachballに対して複数の変更を1つのファイルとして扱うプルリクエストを提出し、変更フォルダを定期的に整理するパイプラインを書いた。

教訓 #2

  • main のミラーである versioned ブランチは、ますますクローンしにくくなっていた。CHANGELOG.mdCHANGELOG.json ファイルしか変更されていないにもかかわらず、125GBもの追加Gitデータを取得していた。
  • Linux Torvaldsがチェックインした古いパッキングコードが、ファイル名の最後の16文字だけを比較して圧縮を行う問題を発見した。そのためGitは別のパッケージの CHANGELOG.md ファイルと比較し、ファイル全体を繰り返しプッシュしていた。
  • git repack -adf --window=250 コマンドを使ってリポジトリのサイズを削減し、新しい git repack -adf --path-walk コマンドを使って178GBから5GBまで減らした。
  • git config --global pack.usePathWalk true 設定を追加し、git push 時に正しいデルタが生成されるようにした。

まとめ

  • 大規模モノレポで CHANGELOG.md のような長い名前のファイルが頻繁に更新される場合は、path walk機能に注目すべき。
  • git survey コマンドを使うと、ディスクサイズ別の上位ファイルや、展開後サイズ別の上位ディレクトリなどを確認できる。
  • Microsoftはリポジトリ拡張のためのソリューションを開発しており、それを世界中に提供している。

GN⁺の要約

  • この記事は、大規模なJavaScriptモノレポのGitサイズを削減する方法についての経験を共有している。特に、古いGitパッキングコードの問題を解決することで、リポジトリサイズを大幅に縮小した。
  • この記事は、大規模プロジェクトで発生しうるGit関連の問題を解決するうえで有用な情報を提供している。特に、CHANGELOG.md のようなファイルの繰り返し更新によって生じる問題の解決方法を説明している。
  • 類似した機能を持つプロジェクトとして、FacebookのBuckやGoogleのBazelがある。これらのツールは大規模コードベースを効率的に管理するのに役立つ。

1件のコメント

 
GN⁺ 2024-10-28
Hacker Newsのコメント
  • 新しいgit-surveyコマンドはまだgit.gitに含まれていない。MicrosoftのGitフォークで追加されたもの

  • nixpkgsをクローンしたとき、--window 250オプションではサイズが1.7GBに減った。Microsoft Gitフォークの--path-walkオプションでは1.9GBに減った

    • どちらのオプションでも初期サイズの半分以下になった
    • GitHubでこれを実行できるとよいし、人々がこれを制御できる形でホスティングされるとなおよい
  • ヨーロッパの一部ユーザーは大きなリポジトリをクローンできないという。サーバー側で変更が行われるまではクローン不可能と思われる

  • ファイル名に完全なパスが含まれていないというミスが原因で問題が発生した。最後の16文字だけを確認していた

  • Derick StoleeがGitの内部構造に関するブログを書いていた。ローカルおよびCIでgit cloneのサイズを減らす方法について多くを学べた

  • Gitをハックするのは楽しいが、2,500個のパッケージをモノレポに含めない方法があるのか気になる

  • MicrosoftはAzure DevOpsを自社で使うのがよい。AzureサービスはGitHubにしかネイティブコネクタを提供していないように見える

  • Gitの内部構造をよく知る人が近くにいるのは、大きなプロジェクトで働くときの大きな利点

  • この投稿に感謝する。オープンソースソフトウェアにとても役立った。Microsoft、GitHub、GitLabは多くの良いものを提供している

  • 最後の16文字と完全パス確認の問題をもっとよく理解したい。デルタ圧縮、パッケージインデックス、マルチパッケージインデックスとどうつながるのか気になる