BitBucket Server에서 git lfs 사용

8342 단어 git-lfsBitbucket

1.Git LFS란?



Git LFS는 작년 10월1에 GitHub에서 Git LFS의 정식 버전이 출시된 git 확장 기능입니다.
구체적인 이용 용도로서는, 큰 바이너리 파일의 버전 관리를 상정한 기능입니다.

git에서 프로젝트를 운영 할 때 큰 바이너리 파일 관리는
가장 머리를 괴롭히는 부분이었던 만큼, 많은 git 관리자 및 이용자에게 기쁜 기능 추가였습니다.
현재 SourceTree와 같은 git 클라이언트 도구에서도 git lfs를 사용할 수 있습니다.

【공식】
Git LFS 공식 사이트

【참고】
큰 바이너리 파일을 처리하기 위한 Git LFS 배포
"Git LFS"를 지원. UI 디자인을 일신한 'SourceTree' v1.8 공개

2. Bitbucket Server에서 git lfs 설정



Bitbucket Server는 버전 4.3부터 git lfs를 지원합니다.

Bitbucket Server 4.3 release notes

git lfs의 활성화는 각 리포지토리에 대해 설정할 수 있으며,
아래 그림과 같이 리포지토리 관리 화면에서 git lfs 기능을 활성화할 수 있습니다.


3. 클라이언트 측에서 git lfs 설정



3-1.git lfs 설치



git lfs 설치는 다른 사이트에서 설명한 것처럼,
tar.gz 파일의 압축을 풀고 install.sh를 두드리는 것입니다.
tar xfz git-lfs-darwin-amd64-1.2.0.tar.gz
cd git-lfs-1.2.0
sudo bash install.sh

3-2. 초기 설정


git lfs install를 실행하면 ~/.gitconfig에 다음 항목이 추가됩니다.
[filter "lfs"]
    clean = git-lfs clean -- %f
    smudge = git-lfs smudge -- %f
    required = true

3-3.track 대상 파일 설정


git lfs track를 실행하면 현재 git lfs의 추적 대상 파일을 볼 수 있습니다.
$ git lfs track
Listing tracked paths

이 명령을 실행하면 아래와 같이 .git 아래에 lfs 디렉토리가 추가됩니다.
.git
├── HEAD
├── config
├── description
├── hooks
│   ├── applypatch-msg.sample
│   ├── commit-msg.sample
│   ├── post-update.sample
│   ├── pre-applypatch.sample
│   ├── pre-commit.sample
│   ├── pre-push
│   ├── pre-push.sample
│   ├── pre-rebase.sample
│   ├── prepare-commit-msg.sample
│   └── update.sample
├── info
│   └── exclude
├── lfs #この配下が追加される
│   ├── objects
│   │   └── logs
│   └── tmp
│       └── objects
├── objects
│   ├── info
│   └── pack
└── refs
    ├── heads
    └── tags

이번에는 *.jpg 파일을 git lfs 대상에 넣었습니다.
$ git lfs track "*.jpg"
Tracking *.jpg
$ git lfs track
Listing tracked paths
    *.jpg (.gitattributes)

4. 실행 결과



4-1.초회 push



git lfs가 준비되면 실제로 1.8M 정도의 jpg 파일을 push 해 보겠습니다.
$ git add dinner.jpg
$ git commit -m '夕食の画像'
[master (root-commit) 0427398] 夕食の画像
 1 file changed, 3 insertions(+)
 create mode 100644 dinner.jpg
$ git push
Git LFS: (1 of 1 files) 1.85 MB / 1.85 MB
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 340 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To ssh://git@****/****/gitlfs-sample.git
 * [new branch]      master -> master

푸시가 끝나면 다른 디렉토리에서 clone 해보십시오.
$ git clone ssh://git@****/****/gitlfs-sample.git
$ du -sh ./gitlfs-sample
104K    ./gitlfs-sample
$ cat gitlfs-sample/dinner.jpg
version https://git-lfs.github.com/spec/v1
oid sha256:7621a0126e06e74c5876d4b32ed83068bcad9c918952439dd14969dd0e71f15d
size 1938859

.jpg가 포인터가되어 있기 때문에 텍스트 파일로 clone됩니다.
그런 다음 2과 같이 git lfs pull를 실행하면 최신 바이너리 파일이 풀링됩니다.

4-2. 바이너리 파일 업데이트



푸시한 사진을 업데이트합니다.
$ git commit dinner.jpg -m '夕食の写真を間違えた'
[master fceea3b] 夕食の写真を間違えた
 1 file changed, 2 insertions(+), 2 deletions(-)
$ git push
Git LFS: (1 of 1 files) 1.31 MB / 1.31 MB
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 396 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To ssh://git@****/****/gitlfs-sample.git
   0427398..fceea3b  master -> master

여기도 다른 디렉토리에서 pull하여 파일 업데이트를 확인합니다.
$ cat dinner.jpg
version https://git-lfs.github.com/spec/v1
oid sha256:1a02144f8c960f0aa6a6cb24fc9e5709584fe0eb212d9bf79578693af31bfdae
size 1371436

해시 키가 변경되었습니다.
당연합니다만, 이것도 git lfs pull 로 pull 해 실 파일을 떨어뜨리는 것이 가능합니다.

덧붙여서, Bitbucket Server에서의 이미지 비교는 다음과 같은 느낌이 듭니다.






5.git lfs 관련 실행 메모



5-1. 서버 측 액세스 로그


*.*.*.* - - [17/Apr/2016:22:17:14 +0900] "POST /scm/****/****.git/info/lfs/objects/batch HTTP/1.1" 200 771 "-" "git-lfs/1.1.2 (GitHub; darwin amd64; go 1.6; git bf6a6c9)" "-" 0.078
*.*.*.* - - [17/Apr/2016:22:17:15 +0900] "PUT /rest/git-lfs/storage/****/****/7621a0126e06e74c5876d4b32ed83068bcad9c918952439dd14969dd0e71f15d HTTP/1.1" 200 5 "-" "git-lfs/1.1.2 (GitHub; darwin amd64; go 1.6; git bf6a6c9)" "-" 0.905
git push 이렇게하면 POST 액세스 로그가 기록됩니다.
또한 git lfs pull 하면 다음 로그가 출력됩니다.
*.*.*.* - - [24/Apr/2016:23:54:32 +0900] "POST /scm/****/****.git/info/lfs/objects/batch HTTP/1.1" 200 782 "-" "git-lfs/1.2.0 (GitHub; darwin amd64; go 1.6.1; git 9bd3b8e)" "-" 0.076
*.*.*.* - - [24/Apr/2016:23:54:36 +0900] "GET /rest/git-lfs/storage/****/****/f7f3a2d4b9d38cbf0466ad555e049b5603ce21896dc2f5f6db5b794680756054 HTTP/1.1" 200 1190697 "-" "git-lfs/1.2.0 (GitHub; darwin amd64; go 1.6.1; git 9bd3b8e)" "-" 4.198

두 로그 모두 UserAgent에 git lfs의 버전이 기록되어 있는 것도 알 수 있을까.

5-2. 클라이언트 git 오류


Git LFS: (2 of 1 files) 266.44 KB / 1.85 MB
Client error: https://****/rest/git-lfs/storage/****/****/7621a0126e06e74c5876d4b32ed83068bcad9c918952439dd14969dd0e71f15d from HTTP 413

Bitbucket Server 앞에 nginx와 같은 웹 서버를 배치하면,
이런 식으로 HTTP 상태 코드가 413으로 반환 될 수 있습니다.
그 때는 POST 사이즈의 용량 제한에 걸려 있기 때문에,
nginx client_max_body_size를 변경하여 POST의 크기 제한을 완화해야합니다.
client_max_body_size 1024M; #利用ファイルのサイズに応じて変更

6.TL;DR



요약으로,
  • Bitbuclet Server는 버전 4.3부터 git lfs를 지원하며 추가 비용없이 사용 가능
  • nginx 등에서 역방향 프록시를 수행하는 경우 POST 크기 제한에주의가 필요합니다
  • SourceTree와 같은 클라이언트 도구에서도 git lfs를 사용할 수 있습니다
  • git lfs pull에서 필요할 때 엔티티 파일을 삭제할 수 있습니다

  • 뭔가 도움이되면.



    GitHub, Git에서 이미지나 동영상 등 대용량 파일을 취급할 수 있는 「Git LFS」(Git Large File Storage) 정식 릴리스 

    Git LFS가 1.0이되어 GitHub에서 사용할 수있게되었으므로 시도했습니다. 

    좋은 웹페이지 즐겨찾기