Git で大きなレポジトリを扱う

# はじめに

　**Git は非常に便利なバージョン管理ツールで、ソースコード管理以外でも様々な用途に用いることができます**。一般的なソースコードであれば、各 Git ホスティングサイトでその制約を超えることは殆どありません。一方で、機械学習における学習データの保存であったり、ゲームのプロジェクトのように、リソースや成果物が大きなファイルであったりなど、レポジトリの容量が大きくなってくると、各ホスティングサイトの容量をオーバーしてしまうことも珍しくありません。ここでは、各ホスティングサイトの制限などを見つつ、どのように大きなレポジトリを扱うかについて話していきます。

# 注意事項

　Git で大きなレポジトリを扱うのは最善とはいえない場合もあります。また、以下に調べた内容が記載されていますが、間違っている場合や、記事の閲覧タイミングによって制約が変わっている可能性もあるので、実際に試す際は、自身で調べてからにすることをおすすめします。

# 結論

 **先に結論を書くと、条件によるが、100MB 以上のファイルを扱ったり、レポジトリサイズが 5GB 以上の場合は迷わず Azure Repos を使おうという結論です。**

# GitLFS

　ファイルサイズが大きなものの場合、 GitLFS を使用しないとレポジトリにプッシュできない場合が多いです。 GitLFS についてはここでは割愛しますが、簡単に使用方法について記述します。例えば、ゲームのプロジェクトにおいて、動画リソースの `.mp4` ファイルを GitLFS で扱いたい場合は、プロジェクトルートで以下のようなコマンドを叩きます。

```
git lfs install // 初回のみ
git lfs track "*.mp4"
```

# 各ホスティングサイトの制限

## GitHub
　言わずと知れた **[GitHub](https://github.com/) ですが、大きなファイルに対しての制限がやや厳し目です**。 [GitHub での大きいファイルについて](https://docs.github.com/ja/repositories/working-with-files/managing-large-files/about-large-files-on-github) 等に詳しい制約について書かれています。また、GitLFS については [ストレージと帯域の利用について](https://docs.github.com/ja/repositories/working-with-files/managing-large-files/about-storage-and-bandwidth-usage) でアカウント毎の制限について書かれています。

* **レポジトリサイズの上限 : 無制限**
    * ただし公式には 1GB、多くても 5GB が良いとアナウンスされている
        * (おそらく使いすぎていると怒られる) 
* **ファイルサイズ上限 : 100MB**
    * GitLFS を使用すれば、ファイルサイズ上限を超えたファイルをコミットできます
        * GitHub における GitLFS の上限としてアカウント毎に全体で
            * **ファイル容量が 1GB まで**
            * **帯域が月 1GB まで**

　**ファイル数が多くても 100MB より小さいファイルを管理する場合は容量制限はなさそうなので、GitHub の知名度を含めて無難ですが、使いすぎると警告がくるようなので、ゲームのようなプロジェクトだと少し難しそうな気がします。**

## GitLab

 GitHub が買収されるみたいな話のときに、移行先として持ち上がった [GitLab](https://about.gitlab.com/)。最近機能も充実してきていて使い勝手は遥かによくなってきたと思いますが、やはり GitHub に比べると劣る部分もあります。[Pricing](https://about.gitlab.com/pricing/) の欄を見ると制限についてもわかりやすいです。

* **レポジトリサイズの上限 : (全て含めて) 5GB (Free プラン)**
    * プランを上げていくと上限も増えるが無制限にはならない
* **ファイルサイズ上限 : 100MB**
    * GitLFS を使用すれば、ファイルサイズ上限を超えたファイルをコミットできます
        * **GitLFS で管理されるファイルもレポジトリ上限に加味されます**

　**上記のように、GitLab レポジトリサイズの上限が厳しく、プランを上げた所でその制約が取り除かれる訳でもないので、大きなレポジトリを扱うにはかなり不向きだと思います。**


## BitBucket

 [BitBucket](https://bitbucket.org/) は Jira, Confluence 等を作っている Atlassian 社が作成・管理しているホスティングサイトです。 Jira, Confluence との連携を目当てで業務目的で使用する方が一般的かなと思います。昔 GitHub でプライベートレポジトリが無料プランでは作れない時に、お世話になった覚えがあります。[リポジトリのサイズを減らす](https://support.atlassian.com/ja/bitbucket-cloud/docs/reduce-repository-size/) にレポジトリサイズについての制約が、GitLFS については [Bitbucket での Git LFS のストレージ ポリシー](https://support.atlassian.com/ja/bitbucket-cloud/docs/storage-policy-for-git-lfs-with-bitbucket/) に記載されています。

* **レポジトリサイズの上限 : 4GB**
    * ただし公式には 1GB、多くても 5GB が良いとアナウンスされている
        * (おそらく使いすぎていると怒られる) 
* **ファイルサイズ上限 : ？ (記載見当たらず)**
    * GitLFS を使用すれば、ファイルサイズ上限を超えたファイルをコミットできます
        * GitLab における GitLFS の上限としてアカウント毎に全体で
            * **ファイル容量が 1GB まで**

 **全体として、GitHub の方が使いやすそうな印象。** GitLFS の帯域制約については書かれていないので、GitLFS のファイルの書き換えが頻繁に発生する場合は、選択肢としてギリギリあがってくるかも？


## Azure DevOps (Azure Repos)

 見慣れないホスティングサイトかもしれませんが、最後に紹介するということはそういうことです。[Azure Repos](https://azure.microsoft.com/ja-jp/products/devops/repos/)　のトップページで案内しているところからも、このレポジトリは容量無制限であることが売りの一つになっています。とはいえ、実際の制限については [Git の制限](https://learn.microsoft.com/ja-jp/azure/devops/repos/git/limits?view=azure-devops)に記載されており、GitLFS については [Git で大きなファイルを管理および格納する](https://learn.microsoft.com/ja-jp/azure/devops/repos/git/manage-large-files?view=azure-devops) に記載されています。

* **レポジトリサイズの上限 : 250GB**
    * ただし公式には 5GB がまでが良いとアナウンスされている
        * 超える場合は GitLFS を使った運用を考えようとアナウンスしている
* **ファイルサイズ上限 : ？ (記載見当たらず)**
    * GitLFS を使用すれば、ファイルサイズ上限を超えたファイルをコミットできます
        * **GitLFS を使用した場合 ファイルサイズ上限 50G があります**

　このように、容量無制限といいつつ実際は 250GB の制限がありますが、ほぼこの制限を超えるようなレポジトリは無いと思いますし、レポジトリとして容量無制限というのも嘘ではないと思います。また、GitLFS を用いた場合のファイルサイズ上限も 50GB とほぼ上限が無いと言えるぐらいまで大きなファイルをコミットすることもできます。無料プランだとチーム人数の制約が 5 人までという制約はありますが、**Azure DevOps が他と比べても圧倒的に向いている**と言えると思います。

### 注意

 手元で Azure Devops を使っていた時に、ファイルサイズが大きいものを GitLFS で送って確認している時に、送信途中に HTTP 413 エラーに遭遇しました。どうやら、 HTTP/2.0 で通信するときに発生するエラーが問題のようで、その場合は HTTP/1.1 に変更すれば問題なく送信することができるようです。[Azure Reposのgit LFSへ大きいサイズのファイルのpushに失敗する](https://nishy-software.com/ja/dev-sw/azure-devops-repos-http-413/) を参考にさせていただきました。ありがとうございます。

```
git config http.version HTTP/1.1
```

# まとめ

　**100MB を超えるファイルが無く、数 GB 程度のレポジトリなら GitHub が使い心地等を含めて便利で、それ以外、もっと大きなファイルサイズのものを扱ったり、レポジトリサイズもそれを超えてくる場合は Azure DevOps を使うのが良いと思います。**