git lfs 서버만 따로 분리하는 방법을 정리한다.
git lfs 기본설정
설정하기 - lfs 대상 파일설정
해당 repo 에 git lfs 대상파일을 .gitattributes
을 이용하여 추가할 수 있다.
*.pdf filter=lfs diff=lfs merge=lfs -text
*.docx filter=lfs diff=lfs merge=lfs -text
*.zip filter=lfs diff=lfs merge=lfs -text
*.7z filter=lfs diff=lfs merge=lfs -text
*.exe filter=lfs diff=lfs merge=lfs -text
*.iso filter=lfs diff=lfs merge=lfs -text
*.pptx filter=lfs diff=lfs merge=lfs -text
*.xlsx filter=lfs diff=lfs merge=lfs -text
*.vsd filter=lfs diff=lfs merge=lfs -text
일단, 위와같은 내용을 추가하여 관리 중 이다.
git lfs 서버 분리
필요 시나리오
필자의 경우 git 을 일종의 클라우드로 사용중이다. 업무용 문서, 자료들을 github private 로 사용중이다. gdrive 나 onedrive 와 같은 서비스들은 히스토리 관리나, 싱크 속도등에서 마음에 들지 않아 git 을 사용중이다.
github 무료 플랜을 잘 사용하고있으나, 항상 큰 파일에 대한 관리가 너무 어려웠다. (매번 gitingore 에 넣고 관리를 하였으나, 결국은 큰 파일도 관리가 필요하게 됐다.)
때문에 일반 파일들은 github 들을 이용하고 특정 파일들을 lfs 서버를 따로 분리하여 관리를 하면, 큰파일들도 문제없이 관리가 가능하다.
lfs 서버 라즈베리파이에 설치
라즈베리파이나 ARM 기반 서버라면, gitea(https://gitea.io/en-us/) 를 설치하자.
- 특징
- go 기반으로 가볍다.
- git 의 거의 모든기능들이 지원가능하다
- lfs 도 지원가능
- arm docker image 제공하여 관리 용이함
lfs 분리 설정
lfs 를 분리하고자 하는 repo 에 .lfsconfig
를 추가하고 다음과 같이 설정하자.
다음과 같이 lfsurl
옵션을 이용하여 분리한다.
[remote "origin"]
lfsurl = http://your_domain:your_port/your_repo.git/info/lfs
테스트를 해보니 몇가지 특이사항이 있어 정리한다. lfs 서버 분리하면서 다음의 사항들을 알아두자.
http
프로토콜만 지원한다. 때문에http://
로 시작하는 git 서버주소를 넣어야한다. (ssh
프로토콜은 미지원)- git repo 의 주소 끝에
info/lfs
를 꼭 넣어야한다. 거의 일반적인 lfs 서버들은 해당 sub url 을 이용하여 git lfs 통신을 하게된다. http
프로토콜이므로 매번 login 계정을 물어본다.http://[user_id]:[user_pass]@your_domain:your_port/your_repo.git/info/lfs
와 같이 설정하거나, git login cache 등을 이용하여 로그인 세션을 저장해야 사용이 편하다.
생각보다 간단 하다.
lfs 분리시 실제 동작내용 확인
lfs 를 분리했을때 github 에서의 화면은 다음과 같다.
- zip 파일들을 lfs 로 분리하였더니, 무조건 1개당 용량은 133byte 만 차지한다.
version https://git-lfs.github.com/spec/v1
oid sha256:cd52d81e25f372e6fa4db2c0dfceb59862c1969cab17096da352b34950c973cc
size 20971520
각 파일들은 위와같은 파일정보만 갖고있다.
해당 repo 를 pull 하더라도 git lfs pull
하기전엔 실제 파일을 다운로드 하지 않는다.
lfs 관련 일반사항들
gitea lfs server 를 구축하고 몇 가지 특이사항들을 정리한다.
server 측면에서의 lfs 파일들의 용량차지
lfs 로 관리를 하다보면 각 파일마다 sha 가 생성되며 파일이 같다고 판단되면 lfs repo 에서 용량을 차지 하지 않는다.
A
,B
가sha
값이 같은 동일한 파일이라고 한다면...- 서버측면 :
A
,B
파일을 동일파일로 간주하여 1개의 파일용량만 차지한다. - 로컬측면 :
git lfs pull
명령시에A
,B
가 각각 생성되어, 각각 용량을 차지하게 된다.
- 서버측면 :
실제 gitea 기준으로 동작을 테스트해보니 파일명이 다른 두개의 동일바이너리는 동일 hash 로 한개만 용량을 차지한다.
local lfs history
과거 버젼 바이너리 히스토리가 .git 폴더에 남아있다.
git lfs prune
혹은 git lfs prune --verify-remote
을 이용하여 .git
폴더내의 lfs 미사용하거나, 중복되는 파일, 과거 히스토리 등을 최적화 시킬 수 있다.
만약 해당 명령어를 매번입력하기 귀찮으면 다음의 config 를 설정한다.
git config --global lfs.pruneverifyremotealways true
lfs 서버쪽의 바이너리 삭제 관련 - 삭제불가
lfs 서버측면에서 lfs 미사용하는 lfs 파일들에 대한 관리는 어떻게 될까?
한마디로 삭제불가하다. 즉, lfs 서버에서는 업로드된 바이너리파일들을 계속적으로 쌓기만한다.
git lfs 쪽 issue 쪽에 보면 unreferenced file 에 해서 삭제방법들을 문의하는글들에 대해서는 다 불가능하다라고 되어있다.
관련한 코멘트는 다음에서 확인가능하다.
https://github.com/git-lfs/git-lfs/issues/4543
Hey,
Git LFS doesn't offer a standard way to delete data on the remote. It's possible that your hosting provider, who in this case is GitLab, has a way for you to do this, but it would be specific to their implementation and not part of the regular client.
git lfs 서버에서는 사용하지않는 과거버젼의 바이너리들을 제거하는 것에 대해서 guide 를 제공하지 않으며, 각자 서비스 제공자가 알아서 하도록 하고있다. gitlab 쪽에서는 방법을 따로 사용하여 진행하는것 같지만 원래는 아예 권고하고 있지 않다.
해당 lfs repo 자체를 아예 삭제하지 않는한은 용량은 계속적으로 늘기만 할 것이다. lfs 서버를 설정할때 이점을 생각하고 repo 생성, 관리를 해야할 듯 하다.
git lfs pull, push 명령어 관련
만약, lfs 와 git 코드 서버가 동일하다면, git lfs pull
, git lfs push
와 같은 명령어는 굳이 사용하지 않아도 된다. git pull
, git push
등의 명령어로 lfs 까지 한번에 동작하게 된다.
lfs 서버를 분리했을경우, git lfs pull
, git lfs push
입력하기 전까지는 실제 lfs 파일들을 다운로드 하지 않는다.