# 2 GiB プッシュ制限のトラブルシューティング

2 GiB プッシュ制限を回避する方法について説明します。

## プッシュ制限について

GitHub には、1 回のプッシュで最大 2 GiB の制限があります。 非常に大きなリポジトリを初めてアップロードしようとしたり、他のプラットフォームから大きなリポジトリをインポートしたり、大規模な既存リポジトリの履歴を書き換えようとしたときに、この制限に達する可能性があります。

この制限に達すると、次のいずれかのエラー メッセージが表示される場合があります。

* `fatal: the remote end hung up unexpectedly`
* `remote: fatal: pack exceeds maximum allowed size`

プッシュをより小さな部分に分割するか、Git 履歴を削除した後最初からやり直して対処します。 2 GiB を超える 1 つのコミットを行い、Git 履歴を削除して最初から開始できない場合は、対話型のリベースを実行して、大きなコミットを複数の小さなコミットに分割する必要があります。

## 大きなプッシュを分割する

プッシュを小さな部分に分割することで、制限に達しないようにすることができます。それぞれのサイズは 2 GiB 未満にする必要があります。 ブランチがこのサイズ制限内にある場合は、一度にまとめてプッシュできます。 ただし、ブランチが 2 GiB を超える場合は、プッシュをさらに小さな部分に分割し、一度に数回のコミットのみをプッシュする必要があります。

1. リモートをまだ構成していない場合は、リポジトリを新しいリモートとして追加します。 詳しくは、「[リモートリポジトリを管理する](/ja/get-started/git-basics/managing-remote-repositories#adding-a-remote-repository)」をご覧ください。

2. ローカル リポジトリのメイン ブランチの履歴に沿って分散された適切なコミットを見つけるには、次のコマンドを実行します。

   ```shell
   git log --oneline --reverse refs/heads/BRANCH-NAME | awk 'NR % 1000 == 0'
   ```

   このコマンドは、1000 回目のコミットごとに表示されます。 数値を増やすか減らすと、ステップ サイズを調整できます。

3. これらのコミットをそれぞれ、GitHub でホストされているリポジトリに一度に 1 つずつプッシュします。

   ```shell
   git push REMOTE-NAME +<YOUR_COMMIT_SHA_NUMBER>:refs/heads/BRANCH-NAME
   ```

`remote: fatal: pack exceeds maximum allowed size` メッセージ が表示された場合は、手順 2 のステップ サイズを小さくして、もう一度やり直してください。

1. 手順 2 の履歴で指定したコミットごとに同じプロセスを実行します。
2. このリポジトリを初めて GitHub にプッシュする場合は、残りの参照がすべて確実にプッシュされるように最後にミラー プッシュを実行します。

   ```shell
   git push REMOTE-NAME --mirror
   ```

   それでも大きすぎる場合は、同じ手順を実行して他のブランチを段階的にプッシュ アップする必要があります。

手順に慣れてきたら、手順 2 から 4 を自動化するとプロセスを簡略化できます。 次に例を示します。

```shell
step_commits=$(git log --oneline --reverse refs/heads/BRANCH-NAME | awk 'NR % 1000 == 0')
echo "$step_commits" | while read commit message; do git push REMOTE-NAME +$commit:refs/heads/BRANCH-NAME; done
```

## 最初から始める

リポジトリに履歴がない場合、または最初のコミットが単独で 2 GiB を超えていて、Git 履歴をリセットしても構わない場合は、最初から開始することもできます。

1. ローカル コピーで、隠し `.git` フォルダーを削除して以前のすべての Git 履歴を削除し、ファイルが詰まった通常のフォルダーに戻します。

2. 新しい空のフォルダーを作成します。

3. 新しいフォルダーで `git init` と `git lfs install` を実行し、新しい空の GitHub リポジトリをリモートとして追加します。

4. 既に Git 大容量ファイルストレージ を使用していて、使用する予定の Git LFS 追跡ルールの一覧がすべて古いフォルダー内の `.gitattributes` ファイルに既に記載されている場合は、それを新しいフォルダーにコピーする最初のファイルにする必要があります。 Git LFS が通常の Git ストレージにコミットされるのを防ぐために、他のファイルを追加する前に、必ず追跡ルールが設定されるようにする必要があります。

   Git LFS をまだ使用していない場合は、この手順をスキップするか、他のファイルをコピーする前に、新しいフォルダー内の `.gitattributes` ファイルで使用する追跡ルールを設定します。 詳しくは、「[Git Large File Storage を設定する](/ja/repositories/working-with-files/managing-large-files/configuring-git-large-file-storage)」をご覧ください。

5. 2 GiB 未満のファイルのバッチを古いフォルダーから新しいフォルダーに移動します。 各バッチを移動したら、コミットを作成し、次のバッチを移動する前にプッシュします。 慎重なアプローチを取り、約 2 GiB にこだわることができます。 または、Git LFS 用のファイルを含むフォルダーがある場合は、バッチあたり 2 GiB の制限を考慮するときにこれらのファイルを無視できます。

古いフォルダーが空になったら、GitHub リポジトリにすべてが入っているはずです。 Git LFS を使用している場合は、Git LFS 用のすべてのファイルを Git LFS ストレージにプッシュする必要があります。