Skip to main content

Устранение неполадок с ограничением push в 2 ГиБ

Узнайте, как обойти ограничение в 2 ГиБ.

О пределе принудительной отправки

GitHub имеет максимальный предел в 2 ГиБ для одного нажатия. Это ограничение может быть достигнуто при попытке отправить очень крупные репозитории в первый раз, импортируя большие репозитории с других платформ или при попытке переписать историю больших существующих репозиториев.

Если вы достигли этого ограничения, вы можете увидеть одно из следующих сообщений об ошибках:

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

Вы можете разделить отправку на небольшие части или удалить журнал Git и начать с нуля. Если вы сделали один коммит размером более 2 ГиБ и не можете удалить историю Git и начать с нуля, то вам потребуется выполнить интерактивное перемещение, чтобы разделить большой коммит на несколько более мелких.

Разделение большого push-уведомления

Вы можете избежать превышения лимита, разбив пуш на более мелкие части, каждая из которых должна быть размером менее 2 ГиБ. Если ветвь находится в пределах этого размера, ее можно отправить одновременно. Однако, если размер ветки превышает 2 ГиБ, вам нужно будет разделить отправку на еще более мелкие части и отправлять только несколько коммитов за раз.

  1. Если вы еще не настроили удаленный, добавьте репозиторий в качестве нового удаленного. Дополнительные сведения см. в разделеУправление удаленными репозиториями.

  2. Чтобы найти подходящие фиксации, распределенные по журналу основной ветви в локальном репозитории, выполните следующую команду:

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

    Эта команда показывает каждую 1000-ю фиксацию. Можно увеличить или уменьшить число, чтобы изменить размер шага.

  3. Отправьте каждую из этих фиксаций в один раз в размещенный репозиторий GitHub.

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

    Если появится сообщениеremote: fatal: pack exceeds maximum allowed size, уменьшите размер шага на шаге 2 и повторите попытку.

  4. Выполните один и тот же процесс для каждой фиксации, определенной в журнале с шага 2.

  5. Если это первый раз, когда этот репозиторий отправляется в 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, вы также можете начать с нуля.

  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.

  5. Перемещайте пакеты файлов размером менее 2 ГиБ из старой папки в новую. После перемещения каждого пакета создайте фиксацию и отправьте ее перед перемещением следующего пакета. Вы можете быть осторожны и придерживаться около 2 ГиБ. В качестве альтернативы, если у вас есть папка с файлами, предназначенными для Git LFS, вы можете игнорировать эти файлы при рассмотрении лимита в 2 ГиБ на партию.

После того как старая папка пуста, репозиторий GitHub должен содержать все. Если вы используете Git LFS, все файлы, предназначенные для Git LFS должны быть отправлены в хранилище Git LFS .