# Устранение неполадок с ограничением 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. Если вы еще не настроили удаленный, добавьте репозиторий в качестве нового удаленного. Дополнительные сведения см. в разделе [Управление удаленными репозиториями](/ru/get-started/git-basics/managing-remote-repositories#adding-a-remote-repository).

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

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

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

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

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

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

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

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

   ```shell
   git push REMOTE-NAME --mirror
   ```

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

После ознакомления с процедурой можно автоматизировать шаги 2–4, чтобы упростить процесс. Например:

```shell
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 (Git Large File Storage — поддержка хранения больших файлов в Git) , которые вы планируете использовать уже перечисленные в `.gitattributes` файле в старой папке, то это должен быть первый файл, который копируется в новую папку. Перед добавлением других файлов необходимо убедиться, что правила отслеживания будут установлены, чтобы не было никаких шансов на Git LFS (Git Large File Storage — поддержка хранения больших файлов в Git) будет зафиксировано в обычном хранилище Git.

   Если вы еще не используете Git LFS (Git Large File Storage — поддержка хранения больших файлов в Git), можно пропустить этот шаг или настроить правила отслеживания, которые вы планируете использовать в `.gitattributes` файле в новой папке, прежде чем копировать все другие файлы. Дополнительные сведения см. в разделе [Настройка Git Large File Storage](/ru/repositories/working-with-files/managing-large-files/configuring-git-large-file-storage).

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

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