문제 상황
-
VSCode에서 Git 커밋 후 “Sync Changes” 버튼을 클릭했을 때 다음과 같은 에러가 발생하였음
1
Git: RPC failed; HTTP 400 curl 22 The requested URL returned error: 400
에러 원인
HTTP Buffer 크기 제한 초과
- Git의 기본 HTTP buffer 크기가 작아서 큰 데이터를 푸시할 때 실패함
- 이미지나 바이너리 파일이 포함된 경우 더 자주 발생함
- GitHub의 요청 크기 제한에 걸리는 경우가 있음
HTTP POST Buffer란?
- Git이 HTTP/HTTPS 프로토콜로 데이터를 전송할 때 사용하는 메모리 버퍼임
- 푸시할 데이터를 이 버퍼에 임시로 저장한 후 서버로 전송함
- 기본값은 1MB (1048576 bytes)로 설정되어 있음
- 전송하려는 데이터가 버퍼 크기를 초과하면 HTTP 400 에러가 발생함
일반적인 발생 시나리오
- 대용량 파일을 커밋했을 때
- 이미지 파일을 다수 추가했을 때
- 여러 변경사항을 한 번에 푸시할 때
해결 방법
HTTP Buffer 크기 증가
-
Git의 HTTP POST buffer 크기를 증가시켜 문제를 해결할 수 있음
1
git config --global http.postBuffer 524288000524288000은 약 500MB를 의미함--global옵션으로 전역 설정함- 이후 모든 Git 저장소에 적용됨
큰 파일 확인 (선택사항)
-
어떤 파일이 큰지 확인하고 싶다면 다음 명령어를 사용함
1
git ls-files -s | sort -k4 -n -r | head -20
푸시 재시도
-
설정 변경 후 다시 푸시를 시도함
1
git push origin master
-
정상적으로 푸시가 완료됨
1 2
To https://github.com/username/repository.git 287662a..641bc20 master -> master
대안 방법
SSH 프로토콜 사용
-
위 방법으로 해결되지 않는다면 HTTPS 대신 SSH를 사용함
1
git remote set-url origin git@github.com:username/repository.git
작은 단위로 나눠서 푸시
-
특정 커밋만 푸시하여 크기를 줄임
1
git push origin <commit-hash>:master
Git LFS 사용
- 큰 파일을 자주 다룬다면 Git Large File Storage(LFS) 사용을 고려함
Git LFS란?
- Git Large File Storage(LFS)는 대용량 파일을 효율적으로 관리하기 위한 Git 확장 기능임
- 큰 파일의 실제 내용은 별도 서버에 저장하고, Git 저장소에는 포인터(참조)만 저장함
- 이미지, 비디오, 데이터셋 등 큰 바이너리 파일을 다룰 때 유용함
-
HTTP buffer 문제를 근본적으로 해결하고 저장소 크기도 줄일 수 있음
1 2 3 4
# Git LFS 설치 및 설정 git lfs install git lfs track "*.png" git lfs track "*.jpg"
정리
- 원인
- HTTP buffer 크기 제한 초과로 인한 푸시 실패
- 해결
git config --global http.postBuffer 524288000설정으로 buffer 크기 증가
- 예방
- 큰 파일은 Git LFS 사용 고려
- 이 설정은 한 번만 해주면 이후 동일한 문제가 발생하지 않음