Git Large File Storage

参考

Git Large File Storage (Git LFS) とは、大容量ファイルを扱うためのGit拡張。オーディオ・ビデオ・データセット・グラフィクスといったファイルをリモートサーバーに格納し、テクストポインタとしてGitで管理することができる。

環境

OS X El Capitan Version 10.11.6
git version 2.10.0

インストール

$ brew install git-lfs
$ git lfs install

使ってみる

新規プロジェクトの場合

まずはバイナリファイルを用意し、これを管理することにする:

$ touch README.md
$ ls > large.bin

git-lfsで管理するファイルのパターンを設定する:

$ git lfs track '*.bin'
Tracking *.bin

'*.bin'のパターンにマッチするすべてのファイルが対象となる。

git-lfsに管理されているファイルパターンを確認するには、引数無しでgit lfs trackを実行する:

$ git lfs track
Listing tracked paths
    *.bin (.gitattributes)

また、pre-pushフックと.gitattributesが作成されている:

$ cat .git/hooks/pre-push
#!/bin/sh
command -v git-lfs >/dev/null 2>&1 || { echo >&2 "\nThis repository is configured for Git LFS but 'git-lfs' was not found on your path. If you no longer wish to use Git LFS, remove this hook by deleting .git/hooks/pre-push.\n"; exit 2; }
git lfs pre-push "$@"

$ cat .gitattributes
*.bin filter=lfs diff=lfs merge=lfs -text

Herokuなんかはgit-lfsに対応していないので、このpre-pushフックを削除しないとうまくビルドできないので注意。

次にこの.gitattributesをコミットする必要がある:

$ git add .gitattributes
$ git add large.bin
$ git commit -m "Added bin"

git lfs ls-filesコマンドでgit-lfs対象のファイルを確認できる:

$ git lfs ls-files
02c2d7a18e * large.bin

既存のプロジェクトの場合

すでにバイナリファイルをgit-lfsを使わずにコミットしており、途中からgit-lfsで管理したいとする:

$ git init .
$ ls > bar.bin
$ ls > foo.bin
$ git add .
$ git commit -m "initial commit"
$ ls > foo.bin
$ git add foo.bin
$ git commit -m "Second commit"

トラック対象のファイルを定義する:

$ git lfs track '*.bin'
$ git add .gitattributes
$ git commit -m "Now tracking bin files"
$ git tag not_working

対象のファイルを定義した.gitattributesをコミットしただけなので、バイナリファイルがlsfオブジェクトに変換されたわけではない。

すでにコミットしたファイルのキャッシュをクリアし、もう一度コミットし直す:

$ git rm --cached *.bin
$ git add *.bin
$ git commit -m "Convert last commit to LFS"

git lfs ls-filesコマンドで対象のファイルを確認する:

$ git lfs ls-files
4665a5ea42 * bar.bin
4665a5ea42 * foo.bin

最新の履歴のfoo.binファイルの中身を確認すると、lfsオブジェクトに変換されていることがわかる:

$ git show HEAD:foo.bin
version https://git-lfs.github.com/spec/v1
oid sha256:4665a5ea423c2713d436b5ee50593a9640e0018c1550b5a0002f74190d6caea8
size 36

過去(バイナリファイルをコミットし直す前)の履歴のfoo.binファイルでは、まだ変換されていない:

$ git show not_working:foo.bin
bar.bin
foo.bin

過去の履歴のファイルも変換するには、git-lfs-migrateを使うらしい。