그냥 사는 이야기

git lfs(large file storage)를 사용하여 대용량 파일 관리하기 본문

Development/기타

git lfs(large file storage)를 사용하여 대용량 파일 관리하기

없다캐라 2020. 6. 8. 19:23
반응형

git은 소스형상관리툴로서 이제 가장 많이 사용하는 툴로 자리잡았습니다. git은 개발 코드의 형상관리를 해주지만 텍스트 파일에 최적화 되어 있습니다. 이미지파일이나 동영상, AI model 파일 같은 binary 파일에 대해서는 그 변화된 증분값 만큼의 관리가 쉽지 않으며, 용량 역시 큰 편입니다. (텍스트 파일에 비해서)

git lfs (Large File Storage)

위의 문제점으로 인해서 이런 용량이 큰 파일들, binary 파일들을 별도로 관리해주기 git lfs 라는 것을 Github에서 만들었습니다. 하지만 다른 git서비스사인 Gitlab, Bitbucket 에서 모두 사용 가능합니다.

git lfs 설치

git lfs를 사용하기 위해서는 git lfs 파일을 별도로 설치하여야 합니다. 여기서는 Windows 에서 사용하였지만 Linux, Mac 에서는 apt나 brew를 사용하여 설치가 가능합니다.

윈도우즈에서는 설치파일을 받은 뒤 실행만 시켜주면 된다

윈도우즈에서는 설치파일을 실행만 시켜주면 되며 기존에 설치한 git의 bash화면에서 실행시켜주면 됩니다.

git lfs 사용하기

git에서는 git init으로 초기화 했지만 git lfs에서는 install 명령을 사용합니다. 테스트를 위해 Readme.md만 존재하는 프로젝트를 사용하였습니다.

$ git lfs install
Updated git hooks.
Git LFS initialized.

이 프로젝트에 psd 파일 하나 추가 해보았습니다.

테스트 해볼 파일은 대략 98mb의 psd 파일이다.

그리고 lfs를 통해서 psd파일을 관리하려고 합니다.

$ git status
On branch master
Your branch is up to date with 'origin/master'.

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        PEVUO01.psd

nothing added to commit but untracked files present (use "git add" to track)

windows-pc@DESKTOP-KVCQHCD MINGW64 /d/repo/simple-project (master)
$ git lfs track "*.psd"
Tracking "*.psd"

windows-pc@DESKTOP-KVCQHCD MINGW64 /d/repo/simple-project (master)
$ ls -al
total 100613
drwxr-xr-x 1 windows-pc 197610         0  6월  8 18:26 ./
drwxr-xr-x 1 windows-pc 197610         0  6월  8 17:49 ../
drwxr-xr-x 1 windows-pc 197610         0  6월  8 18:26 .git/
-rw-r--r-- 1 windows-pc 197610        43  6월  8 18:26 .gitattributes
-rw-r--r-- 1 windows-pc 197610 103014701  9월 11  2018 PEVUO01.psd
-rw-r--r-- 1 windows-pc 197610         0  6월  8 17:49 README.md

git lfs track를 사용하여 관리할 파일을 지정해 주면 .gitattributes 파일이 자동으로 생성됩니다. 내용은 아래와 같습니다.

*.psd filter=lfs diff=lfs merge=lfs -text

그런후 commit & push 를 해주면 아래처럼 올라가는 것을 확인할 수 있습니다.

$ git commit -m "added the first psd file"
[master 2daf8d6] added the first psd file
 2 files changed, 4 insertions(+)
 create mode 100644 .gitattributes
 create mode 100644 PEVUO01.psd

windows-pc@DESKTOP-KVCQHCD MINGW64 /d/repo/simple-project (master)
$ git push
Locking support detected on remote "origin". Consider enabling it with:
  $ git config lfs.https://gitlab.com/rudalson/simple-project.git/info/lfs.locksverify true
Uploading LFS objects: 100% (1/1), 103 MB | 21 MB/s, done
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 12 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (4/4), 475 bytes | 475.00 KiB/s, done.
Total 4 (delta 0), reused 0 (delta 0)
To https://gitlab.com/rudalson/simple-project.git
   88a54e3..2714f64  master -> master   

사내의 gitlab 의 repo url은 대체하고 보여준 표준출력입니다. 이것을 gitlab에서 확인해보면 아래와 같습니다. 그리고 gitlab의 project 용량을 보면 크게 올라간것을 볼 수 있습니다. (기존에는 133KB)

git과 lfs 비교

lfs를 사용하면 어떤 점이 좋을까요? 이걸 확인하기 위해서 lfs를 사용하지 않은 프로젝트를 만들어서 psd파일을 올려보았습니다.

lfs를 사용하지 않으면 63MB. 더 적자나~

캡처한 화면을 보면 lfs를 사용하지 않았을 때 보다 더 적게 나옵니다. 하지만 2번째 commit하고 push를 했을 때 거의 20분간 psd 파일이 용량과 commit count에서 반영이 되지 않았습니다. gitlab의 문제일 수도 있지만 git만 가지고는 binary large 파일이 적절히 관리가 안되는것 같습니다. 하지만 이것만 가지고 lfs가 나은 솔루션이라는 확신이 들지 않았습니다. 3번째 commit에서는 아래와 같습니다.

lfs를 사용한 경우
lfs를 사용하지 않은 경우. 이 때부터는 1byte 수정했는데도 binay파일 모두가 바뀐것처럼 동작한다.

3번째 commit를 하기 위해 binary editor기를 사용하여 1byte만 수정한 채 commit & push를 하였습니다. 그랬더니 lfs를 사용한 경우는 용량의 변화가 없는데 lfs를 사용하지 않은 경우는 2배에 가까운 용량이 올라갔습니다. 

이런식으로 또 다른 곳에 1byte만 수정하여 올려보면 lfs를 사용하는 경우는 차이가 없는데 lfs를 사용하지 않는 곳에서는 188.8mb가 되어 있었습니다. 아마 binary를 text처럼 관리하여 차이점을 스냅샷 하려면 text diff처럼 다루었을 것이고 '\n' 문자를 만나지 못하는 한에서는 1 line처럼 다루었을 것 같습니다. 뭐 어디까지나 추측이지만 text 압축 방식을 사용하였기에 98mb보다 압축되어 63mb라고 나왔겠지만 이후 수정에 대해서는 총 용량의 2배씩 증가하는 비효율적인 관리를 할 것입니다.

결론

binary를 관리하기 위해서는 lfs를 필수적으로 사용하여야 될 것 같습니다. 용량이 클수록 차이는 더욱 커질 것입니다. git의 모든 온라인 서비스를 테스트 해본건 아니지만 내부적으로 git은 동일하기에 대동소이 할 것 같습니다. git의 온라인 서비스사들의 가이드 링크는 아래에 첨부하였습니다.

 

Comments