Skip to main content

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

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

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

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

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

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

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

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

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

  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 .