О пределе принудительной отправки
GitHub имеет максимальный предел в 2 ГиБ для одного нажатия. Это ограничение может быть достигнуто при попытке отправить очень крупные репозитории в первый раз, импортируя большие репозитории с других платформ или при попытке переписать историю больших существующих репозиториев.
Если вы достигли этого ограничения, вы можете увидеть одно из следующих сообщений об ошибках:
fatal: the remote end hung up unexpectedlyremote: fatal: pack exceeds maximum allowed size
Вы можете разделить отправку на небольшие части или удалить журнал Git и начать с нуля. Если вы сделали один коммит размером более 2 ГиБ и не можете удалить историю Git и начать с нуля, то вам потребуется выполнить интерактивное перемещение, чтобы разделить большой коммит на несколько более мелких.
Разделение большого push-уведомления
Вы можете избежать превышения лимита, разбив пуш на более мелкие части, каждая из которых должна быть размером менее 2 ГиБ. Если ветвь находится в пределах этого размера, ее можно отправить одновременно. Однако, если размер ветки превышает 2 ГиБ, вам нужно будет разделить отправку на еще более мелкие части и отправлять только несколько коммитов за раз.
-
Если вы еще не настроили удаленный, добавьте репозиторий в качестве нового удаленного. Дополнительные сведения см. в разделеУправление удаленными репозиториями.
-
Чтобы найти подходящие фиксации, распределенные по журналу основной ветви в локальном репозитории, выполните следующую команду:
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 ГиБ, и вы не против сбросить историю Git, вы также можете начать с нуля.
-
В локальной копии удалите скрытую
.gitпапку, чтобы удалить всю предыдущую историю Git и преобразовать ее обратно в обычную папку, полную файлов. -
создание пустой папки;
-
Запустите
git initиgit lfs installв новой папке и добавьте новый пустой репозиторий GitHub в качестве удаленного. -
Если вы уже используете Хранилище больших файлов Git и имеете все правила отслеживания Git LFS , которые вы планируете использовать уже перечисленные в
.gitattributesфайле в старой папке, то это должен быть первый файл, который копируется в новую папку. Перед добавлением других файлов необходимо убедиться, что правила отслеживания будут установлены, чтобы не было никаких шансов на Git LFS будет зафиксировано в обычном хранилище Git.Если вы еще не используете Git LFS, можно пропустить этот шаг или настроить правила отслеживания, которые вы планируете использовать в
.gitattributesфайле в новой папке, прежде чем копировать все другие файлы. Дополнительные сведения см. в разделеНастройка Git Large File Storage. -
Перемещайте пакеты файлов размером менее 2 ГиБ из старой папки в новую. После перемещения каждого пакета создайте фиксацию и отправьте ее перед перемещением следующего пакета. Вы можете быть осторожны и придерживаться около 2 ГиБ. В качестве альтернативы, если у вас есть папка с файлами, предназначенными для Git LFS, вы можете игнорировать эти файлы при рассмотрении лимита в 2 ГиБ на партию.
После того как старая папка пуста, репозиторий GitHub должен содержать все. Если вы используете Git LFS, все файлы, предназначенные для Git LFS должны быть отправлены в хранилище Git LFS .