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を使うらしい。