大規模なプロジェクトにて複数の Git リポジトリを扱う際はgoogle Repoを使用することがあります。 このRepoにてコードのダウンロードを高速化する方法を説明します。


Google Repo とは

大規模なプロジェクトだと、複数の Git リポジトリが必要になってきます。 そのリポジトリを1つ1つ操作するのは大変なので、大規模プロジェクトでは Repo というツールを使うことが多いと思います。

Repoは複数のGitリポジトリを効率的に扱うツールで、AOSP (Android Open Source Project)などで用いられています。 いろいろなところで使われている Repo ですが、たとえば AOSPはソースコードだけで250GBくらいあり、ダウンロードするだけでも時間がかかってしまいます。 そこで今回は Repo を使ったさいのコードのダウンロードの高速化について説明します。

シャロークローン

通常の Git と同様に Repo を使ってもシャロークローンができます。 シャロークローンは最新のコミットのみをダウンロードします。最新のビルドをしたいなど、過去の履歴が必要ない場合に有効です。 シャロークローンについてはGitHubの公式ブログのパーシャルクローンとシャロークローンを活用しよう に詳しい説明があります。 Repo の init 時に --depth=DEPTHにてシャロークローンができます。通常は 1 を指定しておけばよいでしょう。

1
repo init --depth=1 -u ssh://your-manifest.git -b manifest-branch -m manifest-name

もし過去の履歴が必要になった場合はアンシャローします。過去の履歴が必要なリポジトリの場所に移動して下記を実行します。

1
2
cd git-repository/
git fetch origin master --unshallow

ミラーリング

前述のようにシンボリックリンクで直接projectファイルを共有することもできますが、 repo のミラー機能を使って同じようなことも可能です。 まず最初にミラーとなるソースツリーをダウンロードします。 --mirrorを付けてください。

1
2
3
cd /path/to/mirror/
repo init --mirror -u ssh://your-manifest.git -b manifest-branch -m manifest-name
repo sync

以降は、ミラーを参照するようにします。 --reference を使用してください

1
2
repo init --reference=/path/to/mirror/ -u ssh://your-manifest.git -b manifest-branch -m manifest-name
repo sync

ジョブの並列化

ダウンロード時に -j オプションを付けると並列に実行できます。

1
repo sync -j16

利用可能な CPU の数を確認するには、nproc –all コマンドを実行します。下記のようにすると楽でしょう。

1
repo sync -j$(nproc --all)

フェッチするブランチを限定する

現在のブランチのみフェッチするようにすることでダウンロードを高速化できます。 -c オプションを使用します。

1
repo sync -c

まとめ

大規模プロジェクトを管理する Repo を使ってソースコードをダウンロードするときの高速化について説明しました。 下記の方法で高速にダウンロードできるかなと思います。Jenkins などの CI を回すさいなどに有効かと思います。