BitBucket Server에서 git lfs 사용
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
요약으로,
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
요약으로,
tar xfz git-lfs-darwin-amd64-1.2.0.tar.gz
cd git-lfs-1.2.0
sudo bash install.sh
[filter "lfs"]
clean = git-lfs clean -- %f
smudge = git-lfs smudge -- %f
required = true
$ git lfs track
Listing tracked paths
.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
$ git lfs track "*.jpg"
Tracking *.jpg
$ git lfs track
Listing tracked paths
*.jpg (.gitattributes)
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
요약으로,
*.*.*.* - - [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
*.*.*.* - - [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
Git LFS: (2 of 1 files) 266.44 KB / 1.85 MB
Client error: https://****/rest/git-lfs/storage/****/****/7621a0126e06e74c5876d4b32ed83068bcad9c918952439dd14969dd0e71f15d from HTTP 413
client_max_body_size 1024M; #利用ファイルのサイズに応じて変更
요약으로,
git lfs pull
에서 필요할 때 엔티티 파일을 삭제할 수 있습니다 뭔가 도움이되면.
GitHub, Git에서 이미지나 동영상 등 대용량 파일을 취급할 수 있는 「Git LFS」(Git Large File Storage) 정식 릴리스 ↩
Git LFS가 1.0이되어 GitHub에서 사용할 수있게되었으므로 시도했습니다. ↩
Reference
이 문제에 관하여(BitBucket Server에서 git lfs 사용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/CkReal/items/578fe124e3bda237919a텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)