プッシュ制限について
GitHub には、1 回のプッシュにつき最大 2 GB の制限があります。 非常に大きなリポジトリを初めてアップロードしようとしたり、他のプラットフォームから大きなリポジトリをインポートしたり、大規模な既存リポジトリの履歴を書き換えようとしたときに、この制限に達する可能性があります。
この制限に達すると、次のいずれかのエラー メッセージが表示される場合があります。
fatal: the remote end hung up unexpectedly
remote: fatal: pack exceeds maximum allowed size
プッシュをより小さな部分に分割するか、Git 履歴を削除した後最初からやり直して対処します。 2 GB を超える 1 つのコミットを行った後、Git 履歴を削除して最初から開始することができない場合は、対話型のリベースを実行して、大きなコミットを複数の小さなコミットに分割する必要があります。
大きなプッシュを分割する
プッシュを小さな部分に分割すると、制限に達しないようにすることができます。それぞれのサイズは 2 GB 未満にする必要があります。 ブランチがこのサイズ制限内にある場合は、一度にまとめてプッシュできます。 ただし、ブランチが 2 GB を超える場合は、プッシュをさらに小さな部分に分割し、一度に数件のコミットのみをプッシュする必要があります。
-
リモートをまだ構成していない場合は、リポジトリを新しいリモートとして追加します。 詳しくは、「リモートリポジトリを管理する」を参照してください。
-
ローカル リポジトリのメイン ブランチの履歴に沿って分散された適切なコミットを見つけるには、次のコマンドを実行します。
git log --oneline --reverse refs/heads/BRANCH-NAME | awk 'NR % 1000 == 0'
このコマンドは、1000 回目のコミットごとに表示されます。 数値を増やすか減らすと、ステップ サイズを調整できます。
-
これらのコミットをそれぞれ、GitHub でホストされているリポジトリに一度に 1 つずつプッシュします。
git push REMOTE-NAME +<YOUR_COMMIT_SHA_NUMBER>:refs/heads/BRANCH-NAME
remote: fatal: pack exceeds maximum allowed size
メッセージ が表示された場合は、手順 2 のステップ サイズを小さくして、もう一度やり直してください。 -
手順 2 の履歴で指定したコミットごとに同じプロセスを実行します。
-
このリポジトリを初めて GitHub にプッシュする場合は、最後のミラー プッシュを実行して、残りの参照がプッシュされるようにします。
git push REMOTE-NAME --mirror
それでも大きすぎる場合は、同じ手順を使用して他のブランチを段階的にプッシュ アップする必要があります。
手順に慣れてきたら、手順 2 から 4 を自動化するとプロセスを簡略化できます。 次に例を示します。
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 GB を超えていて Git 履歴をリセットしても問題ない場合は、最初から開始することもできます。
-
ローカル コピーで、隠し
.git
フォルダーを削除して以前のすべての Git 履歴を削除し、ファイルが詰まった通常のフォルダーに戻します。 -
新しい空のフォルダーを作成します。
-
新しいフォルダーで
git init
とgit lfs install
を実行し、新しい空の GitHub リポジトリをリモートとして追加します。 -
既に Git Large File Storage を使用していて、使用する予定の Git LFS 追跡ルールの一覧がすべて古いフォルダー内の
.gitattributes
ファイルに既に記載されている場合は、それを新しいフォルダーにコピーする最初のファイルにする必要があります。 Git LFS が通常の Git ストレージにコミットされるのを防ぐために、他のファイルを追加する前に、必ず追跡ルールが設定されるようにする必要があります。Git LFS をまだ使用していない場合は、この手順をスキップするか、他のファイルをコピーする前に、新しいフォルダー内の
.gitattributes
ファイルで使用する追跡ルールを設定します。 詳しくは、「Git Large File Storage を設定する」を参照してください。 -
2 GB 未満のファイルのバッチを古いフォルダーから新しいフォルダーに移動します。 各バッチを移動したら、コミットを作成し、次のバッチを移動する前にプッシュします。 慎重に、約 2 GB を維持します。 または、Git LFS 用のファイルを含むフォルダーがある場合は、バッチあたりの 2 GB の制限を考慮する際に、これらのファイルを無視できます。
古いフォルダーが空になったら、GitHub リポジトリにすべてが入っているはずです。 Git LFS を使用している場合は、Git LFS 用のすべてのファイルを Git LFS ストレージにプッシュする必要があります。