Skip to main content

2GB 푸시 제한 문제 해결

2GB 푸시 제한을 해결하는 방법을 알아봅니다.

푸시 제한 정보

GitHub은(는) 단일 푸시에 대해 최대 2GB 제한을 가합니다. 매우 큰 리포지토리를 처음으로 업로드하거나, 다른 플랫폼에서 큰 리포지토리를 가져오거나, 기존의 큰 리포지토리의 기록을 다시 작성하려고 할 때 이 제한에 도달할 수 있습니다.

이 제한에 도달하면 다음 오류 메시지 중 하나가 표시 될 수 있습니다.

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

푸시를 더 작은 부분으로 분할하거나 Git 기록을 삭제하고 처음부터 시작할 수 있습니다. 2GB보다 큰 단일 커밋을 수행했지만 Git 기록을 삭제하고 처음부터 시작할 수 없는 경우, 대화형 다시 지정하기를 수행하여 큰 커밋을 여러 개의 작은 커밋으로 분할해야 합니다.

큰 푸시 분할

각각의 크기가 2GB 미만이어야 하는 작은 부분으로 푸시를 분리하여 제한에 도달하는 것을 방지할 수 있습니다. 분기가 이 크기 제한 내에 있는 경우, 한 번에 모두 푸시할 수 있습니다. 그러나 분기가 2GB보다 큰 경우, 푸시를 더 작은 부분으로 분할하고 한 번에 몇 개의 커밋만 푸시해야 합니다.

  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

처음부터 시작

리포지토리에 기록이 없거나 초기 커밋이 자체적으로 2GB를 초과했으며 Git 기록을 다시 설정해도 상관없는 경우 처음부터 시작할 수도 있습니다.

  1. 로컬 복사본에서 숨겨진 .git 폴더를 삭제하여 이전 Git 기록을 모두 제거하고 파일로 가득 찬 일반 폴더로 다시 변환합니다.

  2. 새 빈 폴더를 만듭니다.

  3. 새 폴더에서 git initgit lfs install를 실행하고 새 빈 GitHub 리포지토리를 원격으로 추가합니다.

  4. 이미 Git 대용량 파일 스토리지을(를) 사용하고 있으며 사용하려는 Git LFS 추적 규칙이 이전 폴더의 .gitattributes 파일에 모두 있는 경우, 새 폴더에 처음 복사하는 파일이어야 합니다. Git LFS에 대한 항목이 일반 Git 스토리지에 커밋될 가능성이 없도록 다른 파일을 추가하기 전에 추적 규칙이 적용되었는지 확인해야 합니다.

    Git LFS을(를) 아직 사용하지 않는 경우 이 단계를 건너뛰거나 다른 파일을 복사하기 전에 새 폴더의 .gitattributes 파일에서 사용하려는 추적 규칙을 설정할 수 있습니다. 자세한 내용은 "Git Large File Storage 구성"을(를) 참조하세요.

  5. 2GB보다 작은 파일을 일괄 처리로 이전 폴더에서 새 폴더로 이동합니다. 각 일괄 처리가 수행된 후 커밋을 만들고 푸시한 후 다음 일괄 처리를 수행합니다. 신중한 접근 방식을 취하고 약 2GB를 유지할 수 있습니다. 또는 Git LFS에 대한 파일이 있는 폴더가 있는 경우 일괄 처리 당 2GB 제한을 고려할 때 해당 파일을 무시할 수 있습니다.

이전 폴더가 비어 있으면 GitHub 리포지토리에 모든 항목이 포함되어 있어야 합니다. Git LFS을(를) 사용하는 경우 Git LFS에 대한 모든 파일을 Git LFS 스토리지로 푸시해야 합니다.