Git-lfs 란?

GitHub 는 한번 푸쉬할때 파일의 최대 사이즈는 100MB가 넘어가면 안된다. 그럼 100MB가 넘어가는 파일을 GitHub에 업로드 해야하는 경우는 어떻게 해야 하는가?

GitHub 문서를 보면 해당 내용을 찾아볼 수 있다.

https://docs.github.com/en/repositories/working-with-files/managing-large-files/about-large-files-on-github

 

About large files on GitHub - GitHub Docs

About size limits on GitHub GitHub tries to provide abundant storage for all Git repositories, although there are hard limits for file and repository sizes. To ensure performance and reliability for our users, we actively monitor signals of overall reposit

docs.github.com

문서를 보면 100MB 이상 파일에 대해 Git Large File Storage (Git LFS) 를 사용하라고 나와있다.

Git LFS 가 무엇일까? 문서를 찾아보면

 

Git LFS는 저장소에 파일에 대한 참조를 저장하여 대용량 파일을 처리하지만 실제 파일 자체는 처리하지 않습니다. Git의 아키텍처를 다루기 위해 Git LFS는 실제 파일에 대한 참조 역할을 하는 포인터 파일을 만든다. GitHub은 리포지토리에서 이 포인터 파일을 관리합니다. 저장소를 복제하면 GitHub은 포인터 파일을 맵으로 사용하여 큰 파일을 찾습니다.

 

파일 자체를 분리하는건 아니고 포인터를 통해 대용량 파일을 관리하도록 도와주는 시스템 같습니다.

Git-LFS 적용하기

Git-lfs install

brew install git-lfs

Git-lfs 적용

git-lfs를 적용하고자 하는 디렉토리로 이동 후 lfs를 실행합니다.

git lfs install

File tracking

100MB 넘어가는 파일을 지정해줍니다

저는 Project/Pods/Realm/Core/realm-monorepo.xcframework/watchos-arm64_i386_x86_64-simulator/librealm0monorepo.a 파일 하나만 100MB를 초과했기에 하나만 트랙킹했습니다.

git lfs track (file path)
git lfs track Project/Pods/Realm/Core/realm-monorepo.xcframework/watchos-arm64_i386_x86_64-simulator/librealm0monorepo.a

지정해야할 파일이 여러개인 경우 *문구를 사용하면 좀 더 간편하게 트랙킹할 수 있습니다.

.gitattributes Add

Git lfs를 설정하면, .gitattributes라는 파일이 생기신 것을 확인할 수 있습니다. 이 파일에 Git LFS로 관리되는 파일 정보가 저장되기 때문에 Git에 이 변경사항을 꼭 추가해줘야합니다.

Push

그 후, 원격 저장소로 푸쉬 해주면 됩니다.

git push origin master

하지만, LFS를 설정했는데도 똑같은 에러가 뜨면서 푸쉬가 되지 않는 경우도 있습니다. 해당 경우에는 아래 내용을 추가적으로 진행해야 합니다.

BFG Repo-Cleaner

BFG repo-cleaner는 원격저장소에서 민감하거나 지우고싶은 히스토리 내역을 간단하게 삭제를 도와주는 프로그램이다.

BFG repo-cleaner install

https://rtyley.github.io/bfg-repo-cleaner/ 해당 사이트에 접속해 우측에 있는 bfg.jar 파일을 다운받는다. jar파일이라 실행하려면 기본적으로 java가 필요하다.

 

bfg.jar 실행

해당 명령어를 통해 원하는 repository 디렉토리를 설정해 100MB이상 파일 업로드 내역을 삭제한다.

java -jar bfg.jar --strip-blobs-bigger-than 100M <some-big-repo.git>

만약 정상적으로 실행됐다면

이런식으로 완료됐다고 나옵니다.

만약 완료되지 않았다면 

해당 저장소 디렉토리로 이동 후 아래 명령어를 실행하시고 다시 시도해주세요

git reflog expire --expire=now --all && git gc --prune=now --aggressive

Push

내역을 삭제 후, 원격저장소로 푸쉬한다

 

Reference

https://velog.io/@shin6949/Git-LFS-사용하기

https://bluecolorsky.tistory.com/108

'Git' 카테고리의 다른 글

[Git] .gitignore가 정상적으로 작동하지 않을 때  (0) 2022.11.18
복사했습니다!