github에 용량큰 파일 올리기
카테고리: programming
🚨에러
이 글을 읽고있다면 다음과 같은 에러를 만나는 경우로 들어왔을 것이다.
warning: this is larger than GitHub’s recommended maximum file size of 50.00 MB
error: this exceeds GitHub’s file size limit of 100.00 MB
🦹♀️에러원인
경고창에서 나와있는것 처럼 github은 50MB이상의 파일들에 대해 경고를 주고, 100MB이상의 파일들에 대해 업로드를 허용하지 않기 때문이다. 해결하고싶은 상황에 따라 두가지 방법이 있다.
- 100MB이상의 파일을 꼭 올려야 하는경우
- 100MB이상의 파일을 이제는 사용하지 않는경우(커밋에 남아있는 경우)
⭐️해결하기
🚀해결책1
“100MB이상의 파일을 꼭 올려야 하는경우” 에 대한 해결책이다. 정확히는 “100MiB” 이상에 대해서이다.
웹개발자들은 이런상황이 납득이 안될수도 있겠지만, 대용량 머신러닝 모델을 올린다던지, 굳이 스토리지를 쓰지 않고 1~2개의 파일들만 public에서 필요한다던지 등의 예외상황이 있다.
⭐️해결책1-1: lfs이용 (Large File Storage)
git-lfs
를 이용해서, 대용량 파일을 github에 올릴수가 있다.
⭐️해결책1-2: 외부스토리지 이용
깃헙 유료plan을 구매하는 방법이 있다. 하지만 이는 단순 repository의 용량제한을 열어주는거지, 단일파일 용량제한은 동일하게 100MiB이다.
따라서, 레포의 용량이모자란게 아니라면 해결책 git-lfs
을 사용해야 한다. 그게 아니라면 외부storage를 사용하는것밖에 방법이 없다. (AWS S3에서 불러오기 등)
🚀해결책2
오늘의 주제이다. “100MB이상의 파일을 이제는 사용하지 않지만 커밋에 남아있는 경우”에 대한 해결책이다. 크게 두가지 방법이 있다.
⭐️step1: 해당 커밋을 검색한다
git log --pretty=format:"%h %cd %s" -- "문제가 된 파일의 경로"
필자의 아래처럼 입력했다.
git log --pretty=format:"%h %cd %s" -- "public/mocking/myBigBigBig.json"
하지만 커밋을 못찾는 상황이 생긴다. 이럴때는 follow
옵션을 추가해줘야 한다. 왜냐하면 해당 경로에 있었지만 리팩토링을 하며 경로가 바뀔수도 있기 때문이다. 결과적으로 아래처럼 입력하면 검색이 된다
git log --pretty=format:"%h %cd %s" --follow -- "public/mocking/myBigBigBig.json"
⭐️step2: 커밋 삭제도구 설치
pip를 모르시는 분들이 있을수도 있는데, 파이썬진영쪽의 npm 같은 도구이다.
pip install git-filter-repo
git filter-branch
라는 도구도 있지만 파이썬 기반의 git-filter-repo
라는 이 도구가 더 빠르다고 한다.
(이리저리 찾아봤지만 사실 큰 차이는 없다)
⭐️step3: 커밋 삭제
사실 1번과정은, 해당 커밋이 존재하는지에 대해 검사를 해본거다. 사실 3번과정 하나만으로 충분하다.
아래처럼 입력해주면 삭제가 된다.
git filter-repo --invert-paths --path "문제가 되는 파일경로"
이게 커밋을 지워버리는 위험한 작업이니까 터미널에서 뭐라뭐라 뜨면서 잘 안해준다. 이럴때는 “이게 위험한 행동이지만 내책임이고 나는 할거다”라는 의미로 force
옵션을 추가해주면 된다. 결과적으로 아래처럼 입력했다.
git filter-repo --invert-paths --path "public/mocking/myBigBigBig.json" --force
⭐️step4: 확인
git push를 해보면 이제는 push가 되는걸 확인해볼 수 있을 것이다. 나의 예시에서는 대용량json삭제만 보여줬지만, gif
.mp4
파일등 대용량 이미지도 동일한 방법으로 하나씩 삭제를 해주면 된다.
🚀해결책3
사실… 위의 step1~step4를 쓸 필요가 없다. 위험하지만 더 좋은 방법이 있다. 결론적으로… 다음 명령어 한방에 문제들을 해결할 수 있다.
git filter-repo --strip-blobs-bigger-than 99M
이렇게 하면, 99MiB이상의 파일커밋들을 한번에 모두 없앨 수 있따.
필자의 경우 100MiB이상의 파일포함커밋들을 모두 없앴지만, 50MiB이상의 파일커밋들 때문에 많은 경고문이 떴다. 따라서, 불필요했던 대용량 이미지등 많은 커밋들을 모조리 날려버렸다
// 20MiB이상의 모든 커밋 삭제
git filter-repo --strip-blobs-bigger-than 20M
그 결과, 레포가 1.5GiB에서 700MiB로 줄어들었다. 케케묵은 데이터를 모조리 날려버린 것이다. 이제는 깃헙에도 잘 업로드가 되었다.
✅추가정보
깃헙, 깃랩, 비트버켓의 파일용량업로드, 레포크기 제한에 대한 정보다.
bitbucket
에서는 다음과 같이 말하고있다.
혹시 2GiB이상의 레포용량을 사용하고 있다면…
If your repository is larger than 2 GB, you should consider if you are using Bitbucket correctly. Keep in mind Bitbucket is a code hosting service, not a file sharing service. We offer some suggestions for binaries below.
코드호스팅서비스이지 파일호스팅 서비스가 아니다. 잘 쓰고있냐????
🚀마무리
또 다른 방법들은 없을까? 오래된 커밋들을 지운다던지, 특정기간 이후의 파일들로 검색을 한다던지 여러가지 방법과 옵션을 통해 문제를 해결할 수 있다. 가장 중요한건 백업이다. 5년동안 유지되어왔던 레포의 오래된 커밋을 다 날려버리는게 맞을까? 맞다고 생각이 들면, 꼭 백업을 잘해두고 케케묵은 데이터를 다 날려버리자.
예쁨받는 스맛-트한 개발자에서, 폐급개발자가 되는건 한순간이다. 잘 고민하고, 설득하고, 안전하게 진행하면 좋을 것 같다.
🌜 Thank you for reading it. Please leave your comments below😄
댓글 남기기