github에 용량큰 파일 올리기

Date:     Updated:

카테고리:

태그:

🚨에러

이 글을 읽고있다면 다음과 같은 에러를 만나는 경우로 들어왔을 것이다.

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-fail

🦹‍♀️에러원인

경고창에서 나와있는것 처럼 github은 50MB이상의 파일들에 대해 경고를 주고, 100MB이상의 파일들에 대해 업로드를 허용하지 않기 때문이다. 해결하고싶은 상황에 따라 두가지 방법이 있다.

  1. 100MB이상의 파일을 꼭 올려야 하는경우
  2. 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로 줄어들었다. 케케묵은 데이터를 모조리 날려버린 것이다. 이제는 깃헙에도 잘 업로드가 되었다.


✅추가정보

github-gitlab-bitbucket

깃헙, 깃랩, 비트버켓의 파일용량업로드, 레포크기 제한에 대한 정보다. 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😄

맨 위로 이동하기

programming 카테고리 내 다른 글 보러가기

댓글 남기기