关于推送限制
GitHub 对单次推送的最大限制为 2 GB。首次上传非常大的仓库、从其他平台导入大型仓库或尝试重写大型现有仓库的历史记录时,可能会遇到此限制。
如果遇到此限制,您可能会看到以下错误消息之一:
fatal: the remote end hung up unexpectedly
remote: fatal: pack exceeds maximum allowed size
您可以将推送拆分为较小的部分,或删除 Git 历史记录并从头开始。如果您进行了一次大于 2 GB 的提交,并且无法删除 Git 历史记录并从头开始,则需要执行交互式变基将大型提交拆分为多个较小的提交。
拆分大型推送
您可以通过将推送分解成较小的部分来避免达到此限制,每个部分的大小应小于 2 GB。如果分支在该大小限制内,您可以一次性推送所有内容。但是,如果分支大于 2 GB,则需要将推送拆分成更小的部分,并一次仅推送少量提交。
-
如果尚未配置远程仓库,请添加仓库作为新的远程仓库。更多信息,请参阅“管理远程仓库”。
-
要在本地仓库的主分支历史记录中找到合适的、分散的提交,请运行以下命令:
git log --oneline --reverse refs/heads/BRANCH-NAME | awk 'NR % 1000 == 0'
此命令显示每 1000 次提交。您可以增加或减少此数字以调整步长。
-
一次推送一个这些提交到您 GitHub 托管的仓库。
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 存储中。