Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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機能を有効化できます。
gitlfs_enable.png

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のtrack対象ファイルを確認できます。

$ 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

pushし終わったら、別のディレクトリで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を実行してあげれば、最新のバイナリファイルがpullされてきます。

4-2.バイナリファイルを更新する

pushした写真を更新します。

$ 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での画像比較は、以下のような感じになります。

hikaku1.png
hikaku_2.png
hikaku_3.png
hikaku_4.png

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などのwebサーバを配置していると、
このように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で、必要なときに実体ファイルを落としてくることが可能

何かのご参考になれば。

classi
学校の先生・生徒・保護者向けのB2B2Cの学習支援Webサービス「Classi(クラッシー)」 を開発・運営している会社です。
https://classi.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away