О пределе принудительной отправки
GitHub имеет максимум 2 ГБ для одной отправки. Это ограничение может быть достигнуто при попытке отправить очень крупные репозитории в первый раз, импортируя большие репозитории с других платформ или при попытке переписать историю больших существующих репозиториев.
Если вы достигли этого ограничения, вы можете увидеть одно из следующих сообщений об ошибках:
fatal: the remote end hung up unexpectedly
remote: fatal: pack exceeds maximum allowed size
Вы можете разделить отправку на небольшие части или удалить журнал Git и начать с нуля. Если вы сделали одну фиксацию размером более 2 ГБ, и вы не можете удалить журнал Git и начать с нуля, вам потребуется выполнить интерактивную перебазу, чтобы разделить большую фиксацию на несколько небольших.
Разделение большого push-уведомления
Вы можете избежать достижения предела, разбив принудительную передачу к небольшим частям, каждая из которых должна быть меньше 2 ГБ в размере. Если ветвь находится в пределах этого размера, ее можно отправить одновременно. Тем не менее, если ветвь превышает 2 ГБ, необходимо разделить push-передачу на еще более мелкие части и отправить только несколько фиксаций за раз.
-
Если вы еще не настроили удаленный, добавьте репозиторий в качестве нового удаленного. Дополнительные сведения см. в разделе Управление удаленными репозиториями.
-
Чтобы найти подходящие фиксации, распределенные по журналу основной ветви в локальном репозитории, выполните следующую команду:
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 .