⚠️ 문제
우리 프로젝트의 경우, Github에서 작업하고 Gitlab으로 작업사항을 자동으로 푸쉬하는 자동화 과정을 거치고 있다.
ai 모델을 본 서비스와 합치려고 메인 브랜치에 ai 브랜치를 머지했는데 그 이후로, Gitlab에 auto sync가 안된다..ㅠㅠ
무수한 Github Actions 시도의 흔적..
ai 브랜치를 머지한 뒤로 계속 Github Actions 가 여섯시간을 혼자 돌아가다 Fail이 뜨고서야 문제인 걸 알았다.
🏃 시도
Try 1 : Gitlab에 강제로 push 하기
억지로 Gitlab Repository 에 푸쉬하면 Github Actions도 작동하지 않을 까 하는 생각에 Gitlab 레포에 Github 작업 상황을 push 했다. 그리고 나서 나온 에러…🤬
Enumerating objects: 19240, done.
Counting objects: 100% (19226/19226), done.
Delta compression using up to 8 threads
Compressing objects: 100% (17352/17352), done.
**remote: fatal: pack exceeds maximum allowed size**
- 이때서야 알았다… Gitlab 레포에 푸쉬할 수 있는 최대 파일 크기가 10MiB라는걸.
💡 참고로 Github는 50Mb부터 Warning이 표시되고, 100Mb부터는 push시 Error가 발생한다고 한다.
ai 브랜치 머지하기 전 총 파일들 크기 합이 23MiB인데.. 대체 뭐가 용량이 크게 적용된 건지 모르겠다.
Receiving objects: 100% (1781/1781), 9.44 MiB | **23.80 MiB/s**, done.
Resolving deltas: 100% (910/910), done
Try 2 : Repository push file 용량 키우기
https://stackoverflow.com/questions/15125862/github-remote-push-pack-size-exceeded
- 구글링하다가 Gitlab의 레포지토리 용량을 키우는 방법을 발견했다.
git config pack.packSizeLimit 1g
- stackoverflow에 있는 대로 우선 이렇게 수행했다.
- But,, 될리가 없었음
- 이건 로컬 작업 상황에만 반영될 뿐 원격 푸시에는 1도 안먹힌다고 한다^^
Try 3 : Git LFS 사용하기
- 대용량 파일을 관리하는 Git LFS라는 걸 발견했다.
- Git LFS는 용량이 큰 파일을 따로 보관하는 별도 저장소라고 보면 된다.
git lfs install # initialize the Git LFS project
git lfs track "*.iso" # tracking 하려는 파일 확장자명
- https://docs.gitlab.com/ee/topics/git/lfs/index.html#git-large-file-storage-lfs
- 요기에 나온 대로 lfs를 설치했다.
- lfs를 설치하면
.gitattributes
파일이 생긴다. - 다시 푸쉬를 해봤는데 또 똑같은 에러 발생. → 아예 진전이 없다.(전에 멈췄던 퍼센트에서 동일하게 멈췄다.)
- 그리구 애초에 용량이 큰 파일이 없다!!!! 가장 최대로 큰 파일이 700KB 정도?
하,, 도라방구..😂
- 그리구 애초에 용량이 큰 파일이 없다!!!! 가장 최대로 큰 파일이 700KB 정도?
- 아마도 log 파일이 무지막지하게 큰가 보다.
Try 4 : BFG Repo-Cleaner로 Repository 최적화 하기
- https://medium.com/@stargt/github에-100mb-이상의-파일을-올리는-방법-9d9e6e3b94ef
- 위 포스팅을 발견하고 BFG Repo-Cleaner를 적용해봤다.
1. https://rtyley.github.io/bfg-repo-cleaner/ 공식 사이트에서 제공하는 jar 파일을 최적화하려는 타겟 디렉토리의 상위에 설치한다
2. 이후 아래 명령어로 100M이상인 파일들을 정리한다.
java -jar bfg-{버전 명시}.jar --strip-blobs-bigger-than 100M {clean 작업할 디렉토리 명}
# java -jar bfg-1.14.0.jar --strip-blobs-bigger-than 10M GongAnts_Untact_Study_Room.git
3. 아래와 같은 출력이 나오면 성공! ✨
This repo has been processed by The BFG before! Will prune repo before proceeding - to avoid unnecessary cleaning work on unused objects...
Completed prune of old objects - will now proceed with the main job!
Scanning packfile for large blobs: 41896
Scanning packfile for large blobs completed in 172 ms.
Found 1 blob ids for large blobs - biggest=2022003 smallest=2022003
Total size (unpacked)=2022003
Found 92 objects to protect
Found 7 commit-pointing refs : HEAD, refs/heads/ai, refs/heads/back-end, ...
...
Cleaning
--------
Found 205 commits
Cleaning commits: 100% (205/205)
Cleaning commits completed in 131 ms.
BFG aborting: No refs to update - no dirty commits found??
4. 그리고 최적화가 모두 완료된 뒤, 타겟 디렉토리로 들어간다.
cd {디렉토리 명}
# cd GongAnts_Untact_Study_Room.git
5. 이후 해당 명령어 수행
git reflog expire --expire=now --all && git gc --prune=now --aggressive
# 커밋 로그를 모두 복원시키기 위한 명령어
6. 원격 저장소로 푸시한다.
git push --mirror https://github.com/GongAnts/GongAnts_Untact_Study_Room.git
💡mirror 옵션을 사용하는 이유? → 푸시하려고 보니 아래와 같은 에러가 나왔다.
—-mirror
옵션 : 원격 저장소(remote repository)의 복사본을 만든다. 이것은 --bare 옵션을 포함한다.
! [remote rejected] refs/pull/1/head -> refs/pull/1/head (deny updating a hidden ref)
...
- https://iamcho2.github.io/2021/04/24/git-mirroring
- 위 포스팅을 보고 clone할 때는
—-bare
옵션을 붙여서 clone 했고 push할 때는--mirror
옵션을 붙여서 push 했다.
- 위 포스팅을 보고 clone할 때는
보통 여기까지하면 다들 성공하던데 …
이 방법도 실패했다.
혹시나 실패할까봐 테스트 레포지토리를 만들어서 푸시했었는데 정말 다행이다…😂
Receiving objects: 100% (20948/20948), **244.88 MiB** | 20.54 MiB/s, done.
Resolving deltas: 100% (994/994), done.
최적화한 레포 내 파일들의 크기가 모두 그대로 였다…^^
✨ 해결
진짜 최후의 방법으로 결국 모든 커밋들을 ai 브랜치 머지 전으로 되돌리고 다시 푸쉬를 진행했다😭😭
git reset --hard {되돌아 가려는 커밋}
git push --force
이렇게 하니까 안돌아가던 Github Actions도 다행히 잘 돌아갔고 파일 크기들도 정상적으로 돌아왔다!! 🥳
이후, 번거롭지만 ai 브랜치 머지 후 커밋했던 내용들을 다시 커밋해줬다ㅎ
그리고 ai 브랜치도 커밋 내역을 초기화하고 모델 파일, 모델이 임베드 정적 파일들을 다시 올려주니까 용량 문제가 다시 발생하지 않았다.
아마 이렇게 된 이유가 전에 커밋할 때 모델 학습 데이터 사진 파일을 압축안하고 그대로 올린 적이 있었는데 그게 문제인 것 같다.
🔗 참고
- Account and limit settings
- Github의 최대 용량은?
- Github에 100MB 이상의 파일을 올리는 방법
- BFG Repo-Cleaner
- github repo를 커밋로그 포함해서 옮기기
💡 깨달은 점
- 레포지토리의 크기는 1GB 미만으로 유지하는 게 좋으며 5GB 미만이 좋다고 한다.
- 용량이 큰 파일을
.gitignore
에 추가해서 원격 저장소에 올리지 않고 따로 관리하는 게 좋다. - Git LFS를 이용하면 레포지토리 내에서 별도의 저장 공간에 접근할 수 있다.
- BFG Repo-Cleaner를 이용해서 지난 커밋 로그들을 관리할 수 있다.
- 절대 절대 절대 이미지 파일을 그대로 올리지 말자…! 😭
'🎨 Project' 카테고리의 다른 글
[BE/Node.js] AWS S3에 log 저장하기 (0) | 2022.10.04 |
---|---|
[BE/GitLab] GitLab Pipelines로 배포 자동화하기 (0) | 2022.10.01 |
[BE/Node.js] apidoc으로 api document 만들기 (0) | 2022.09.02 |
[BE/Node.js] bcrypto를 이용한 비밀번호 암호화 (0) | 2022.09.02 |