git 원격 repository에 한 번에 큰 용량의 파일들 또는 매우 작은 용량의 다수의 파일들을 push 하는 경우 다음 에러가 발생할 수 있다.
$ git push origin main
Enumerating objects: 746, done.
Counting objects: 100% (746/746), done.
Delta compression using up to 12 threads
Compressing objects: 100% (634/634), done.
error: RPC failed; HTTP 500 curl 22 The requested URL returned error: 500
send-pack: unexpected disconnect while reading sideband packet
Writing objects: 100% (744/744), 2.17 GiB | 12.01 MiB/s, done.
Total 744 (delta 93), reused 737 (delta 92), pack-reused 0
fatal: the remote end hung up unexpectedly
Everything up-to-date
에러가 발생한 부분을 하나씩 살펴보자.
error: RPC failed; HTTP 500 curl 22 The requested URL returned error: 500
HTTP 500 에러는 요청을 처리하는 과정에서 서버가 예상하지 못한 상황에서 발생한 오류를 총칭하는 에러 코드이다.
다시 말해 구체적이기 보다는 추상적인 에러 코드라는 것이며 이에 따른 구체적인 오류의 원인을 찾기 위해서는 서버의 로그를 직접 분석해야한다.
https://developer.mozilla.org/ko/docs/Web/HTTP/Status/500
send-pack: unexpected disconnect while reading sideband packet
말 그대로 sideband packet을 읽는 동안 연결이 해제되었다는 뜻이며 원인으로는 네트워크 오류나 대용량 파일 전송 등이 있다.
해결 방법은 여러가지가 있는 것으로 알려져있으며 궁극적인 해결법은 맨 하단에 있다.
1. 글로벌 config 설정
다음 내용들을 git bash에 입력한다.
되도록 하나씩 입력하는 것을 권장한다.
# git config --global 이란 사용자 폴더에 위치한 .gitconfig를 수정한다.
# .gitconfig는 여러개의 github 계정이 공유하는 설정값이다.
# 서버에 문제가 있는 경우에만 해당하며 버퍼의 크기를 늘린다.
# 충분히 전송가능할 정도로 작은 파일의 경우에는 아래 설정을 제거하는 것을 추천한다.
git config --global http.postBuffer 524288000
# git은 파일을 저장할 때 자동으로 압축한다. 이 압축을 하지 않도록 한다.
git config --global core.compression 0
# 위와 비슷한 내용으로 델타 압축을 비활성화한다.
git config --global pack.window 1
2. git 환경변수 설정
# git 환경 변수 설정
# 네트워크 작업에 대한 패킷 추적 활성화
set GIT_TRACE_PACKET=1
set GIT_TRACE=1
# curl 라이브러리에서 생성된 모든 메시지를 git에 전송하도록 함
set GIT_CURL_VERBOSE=1
아래는 git 환경설정과 관련한 변수들 모음이다.
https://git-scm.com/book/en/v2/Git-Internals-Environment-Variables
3. 파일을 나누어 push하기
내가 해결한 방법이다.
위의 설정으로도 불가능한경우 git add -p 명령어로 선택적으로 파일을 스테이징하며 전체 파일들을 분할하여 git에 push 하는 것이다.
github를 쓴다면 폴더단위로 나누어서 훨씬 간편하게 할 수 있다.
나의 경우 크기가 가장 큰 파일은 30mb 정도밖에 되지 않았으나 파일들이 모여 2gb~3gb를 넘어가는 시점에서는 버퍼의 공간이 꽉 찬것인지 연결이 해제되어버린다.
하지만 파일을 분할하여 전송해보니 용량이 2gb가 되는데도 불구하고 정상적으로 push되었다.
버퍼에서 허용하는 임계치가 있을 것으로 추정한다.
결론적으로 위의 설정값 변경 보다는 이 방법이 훨씬 직관적이고 효과적이다.
참조