LibreOfficeソースコードのめっちゃデカいgitリポジトリーを素早くcloneする

nogajun
nogajun

_ MicrosoftがVisual StudioとWindowsをまとめた仮想マシン環境を配布しているので、WindowsのLibreOfficeビルド環境を作るかと思いたちましたが、そうなるとLibreOfficeのソースコードのクローンがネックになります。

これが、ただでさえLibreOfficeのソースコードは大きいのにサーバーがヨーロッパにあるので、めちゃくちゃ遅いんです。

すぐにクローンしたいと思っていたところ、はてブでこういう記事を見かけたので、本家リポジトリgithubミラーリポジトリでShallow cloneをテストしてみました。

githubミラーからShallow clone

 $ time git clone --depth=1 --recurse-submodules --shallow-submodules https://github.com/LibreOffice/core.git libreoffice

 real    2m7.696s
 user    0m42.650s
 sys     0m14.157s

 リポジトリディレクトリの容量: 4.3GB

githubミラーから通常のclone

 $ time git clone --recursive https://github.com/LibreOffice/core.git libreoffice

 real    34m17.352s
 user    23m43.628s
 sys     4m1.706s

 リポジトリディレクトリの容量: 17GB

本家リポジトリからShallow clone

 $ time git clone --depth=1 --recurse-submodules --shallow-submodules https://gerrit.libreoffice.org/core ibreoffice

 real    197m18.565s
 user    1m1.224s
 sys     0m25.004s

 リポジトリディレクトリの容量: 4.3GB

結果を受けて

本家リポジトリからShallow cloneは3時間半なので論外ですね。 逆にgithubミラーからのShallow cloneは2分という驚異的な速さなので、CIやすぐにビルドしたい人にはgithubからShallow cloneするのが良さそう。初めてcloneする場合もgithubからクローンすると30分ほどでcloneできるので、こっちを使うのがいいかも。

githubからcloneして本家に追従するには

githubからcloneした場合、originがgithubになります。githubを使って最初だけcloneして日々の更新は本家から差分をpull/fetchするには、originを変更するかremoteを追加してpull/fetchするようにする必要があります。

こんな感じにoriginじゃなく -o github とオプションをつけてgithubの名前でcloneして、git remote addで本家をoriginで追加します。

 $ git clone --recursive -o github https://github.com/LibreOffice/core.git libreoffice
 $ cd libreoffice
 $ git remote add origin https://git.libreoffice.org/core

LibreOfficeのリポジトリには、submoduleでdictionaries、help、translationsもあるので、git remoteで、それぞれ変更します。

 $ cd dictionaries
 $ git remote set-url origin https://git.libreoffice.org/dictionaries
 $ cd ../helpcontents/
 $ git remote set-url origin https://git.libreoffice.org/help
 $ cd ../translations/
 $ git remote set-url origin https://git.libreoffice.org/translations

これで、本家を追うことができます。

githubからshallow cloneしたけど解除したいと思ったらunshallow(下のコマンド)してから上に書いたリモートの付け替えをすればOK。

$ git fetch --unshallow