오늘은 깃허브 이슈로 인해 개발은 많이 진행하지 못했으나, 대신 두렵고 속상한 일을 겪을 수도 있는(하드리셋) 깃허브 이슈에 대해 원인이 무엇이었는지, 어떻게 해결했는지를 이야기해보려한다.
1. 문제 발생
다른 브랜치에서 내가 작업하던 브랜치로 merge 받았을 때, 갑자기 깃허브 데스크탑이 먹통이 되면서 무한 Fetch origin을 하는 상황이 일어났다. 이후 깃허브를 강제 종료하고 다시 켰을 땐 브랜치로 들어가지는 것이 아니라 Publish branch 버튼이 나오고 누르면 아무 작동도 하지 않아 브랜치 안을 볼 수도, 내가 바꾼 것을 커밋할 수도 없는 상황이 되어버렸다.
2. 해결 시도
팀원들에게 상황을 알리고 다른 팀원들의 로컬 컴퓨터에선 어떻게 작동하는지 물어보았는데 다른 팀원은 내가 작업하던 브랜치에 들어갈 수 있었다. 그래서 내 브랜치를 복사하여 temp 브랜치를 만들어 임시로 저장해두었고 이후 나의 로컬 컴퓨터에서 깃 리포지토리 삭제, 로컬 파일 전체 삭제, 깃허브 데스크탑 삭제 후 재설치, 이후 다시 클론 리포지토리를 통해 받아오기를 했지만 계속 같은 문제가 반복되었다. 한번은 잘 작동하는 것처럼 보여서 해결이 된 줄 알았으나 다시 같은 상황이 벌어졌는데, 해결하기를 약간은 포기하고 쉬었다가 들어오니 시간이 지나서 알아서 원래대로 돌아왔다. 그러나 새로 발생한 문제는 프로젝트 파일의 용량이 너무 커져있었다는 것이다.
3. 다른 문제 발생
프로젝트 파일의 용량은 어느새 36기가 정도로 커져있었다. 잘 보니 프로젝트 안의 .git 폴더가 용량이 아주 컸고, 그 안에서도 lfs라는 폴더가 대부분의 용량을 차지하고 있었다. 이 문제는 고민하고 있어도 해결이 되지 않으리라는 생각에 튜터님께 여쭤보러 가게 되었다. 튜터님께서도 이리저리 보시더니 깃허브의 lfs라는 폴더에 대해서 이야기해주셨다.
4. 깃허브 lfs란?
깃허브 공식 문서 :
GitHub는 리포지토리에 허용되는 파일의 크기를 제한합니다. 이 제한을 넘어 파일을 추적하려면 Git 대용량 파일 스토리지을(를) 사용할 수 있습니다.
정보
Git LFS은(는) 파일에 대한 참조를 리포지토리에 저장하여 대용량 파일을 처리하지만 실제 파일 자체는 처리하지 않습니다. Git의 아키텍처를 해결하기 위해 Git LFS은(는) 실제 파일(다른 곳에 저장됨)에 대한 참조 역할을 하는 포인터 파일을 만듭니다. GitHub는 리포지토리에서 이 포인터 파일을 관리합니다. 리포지토리를 복제할 때 GitHub는 포인터 파일을 맵으로 사용하여 대용량 파일을 찾습니다.
Git LFS에 대한 여러 최대 크기 한도는 GitHub 한도에 따라 적용됩니다.
포인터 파일 형식
Git LFS의 포인터 파일은 다음과 같습니다.
version https://git-lfs.github.com/spec/v1
oid sha256:4cac19622fc3ada9c0fdeadb33f88f367b541f38b89102a3f1261ac81fd5bcb5
size 84977953
사용 중인 Git LFS의 version을(를) 추적한 다음 파일(oid)에 대한 고유 식별자를 추적합니다. 또한 최종 파일의 size을(를) 저장합니다.
정리하자면 깃허브 lfs는 대용량 파일들을 올릴 수 있도록 참조 포인터 파일을 만들어 올린다는 것이다.
5. 원인과 해결
우리가 프로젝트 도중 만들었던 한 Scene에서 상당한 용량을 잡아먹는 오브젝트들이 있었다가 원본 에셋들이 삭제된 상태였고, 이 때문에 lfs 폴더에도 큰 용량들의 파일들이 생성되었던 것 같다. 깃허브에서도 접근을 하려하는데 에셋이 없으니 계속해서 반복해서 접근하며 로그파일들을 만든 것도 같았다.
그래서 테스트로 튜터님의 컴퓨터에서 lfs 폴더의 모든 것들을 지우고 임시 txt 파일 하나만 만들어 넣고 깃허브에 올려보았다. 이후 테스트 파일도 지우고 깃에서 Push, Pull 해보았는데 이상 없이 잘 작동했다. 이후 나의 컴퓨터에서도 똑같이 lfs 폴더의 모든 것을 삭제하고 임시 txt 파일 하나를 넣은 후, 삭제하는 것까지 Push, Pull 하여 정상화할 수 있었다.
오늘은 개발은 거의 못했지만 중요한 문제를 하나 잘 짚고 해결하고 넘어간 것 같아서 아주 다행이라는 생각이 드는 하루였다. 처음엔 상당히 골치아프고 머리가 지끈거리는 일이었는데, 그래도 팀원들과 튜터님이 있어서 잘 해결할 수 있었던 것 같아 팀원들과 튜터님께 감사한 마음을 전하고 싶다. 앞으로도 무언가 해결할 일이 있을 때 팀원들과 소통을 활발히 하고 시도해보다가 막힌다면 튜터님께 여쭤보는 게 아주 좋을 것 같다고도 생각이 들었다.