728x90

⚠️ 문제

우리 프로젝트의 경우, 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 정도? 하,, 도라방구..😂
  • 아마도 log 파일이 무지막지하게 큰가 보다.

 

 

Try 4 : BFG Repo-Cleaner로 Repository 최적화 하기

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)
...

 

보통 여기까지하면 다들 성공하던데 …

이 방법도 실패했다.

혹시나 실패할까봐 테스트 레포지토리를 만들어서 푸시했었는데 정말 다행이다…😂

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 브랜치도 커밋 내역을 초기화하고 모델 파일, 모델이 임베드 정적 파일들을 다시 올려주니까 용량 문제가 다시 발생하지 않았다.

아마 이렇게 된 이유가 전에 커밋할 때 모델 학습 데이터 사진 파일을 압축안하고 그대로 올린 적이 있었는데 그게 문제인 것 같다.

 

 


🔗 참고

 

 


💡 깨달은 점

  • 레포지토리의 크기는 1GB 미만으로 유지하는 게 좋으며 5GB 미만이 좋다고 한다.
  • 용량이 큰 파일을 .gitignore 에 추가해서 원격 저장소에 올리지 않고 따로 관리하는 게 좋다.
  • Git LFS를 이용하면 레포지토리 내에서 별도의 저장 공간에 접근할 수 있다.
  • BFG Repo-Cleaner를 이용해서 지난 커밋 로그들을 관리할 수 있다.
  • 절대 절대 절대 이미지 파일을 그대로 올리지 말자…! 😭
728x90