Git
Unity
GitLFS

Unity のプロジェクトで Git LFS を初めて使った所感

前提知識

基本的な Git の知識(commit push pull checkout はわかる)

概要

Unity のリポジトリを GitHub で管理する際、バイナリファイルをどうしようか問題が必ずでる。
GitHub + svn で管理した経験はあるが、GitHub + GitLFS で管理は初めてだったので、それの所感でもまとめていきたい。

Git LFS の仕組み

Git LFS 対象に設定したファイルは、GitHub 上のリポジトリではなく、Large File Storage に保存される。そのファイルの実体が GitHub のリポジトリに保存されるわけではないので、差分のでないバイナリファイルが変更されたとしても、リポジトリの肥大化にはならない。
スクリーンショット 2018-05-08 11.53.58.png

(https://git-lfs.github.com/ より画像引用)

Git LFS 対象ファイルを設定するには?

Unity のプロジェクトファイルに .png が存在し、そのファイルを GitLFS 対象のファイルに設定する場合、

$ git lfs track "*.png"

とコマンドラインを叩けば、 .png はすべて Git LFS 対象となってくれる。
ディレクトリごとにも設定可能で、ディレクトリ単位で設定したければ、そのディレクトリに移動して上記コマンドラインを叩けば、そのディレクトリだけ .png をすべて Git LFS 対象とするなど簡単に設定ができる。

Git 上では Git LFS 対象のファイルはどう見えているの?

Git 上では は存在しているが、中身は実態ではなく Git LFS のポインタを持っている。

Git LFS 対象にしたファイル(.png)を適当なテキストエディタで開くと以下のようになっている。

実体は無いので、実体を引っ張ってくる作業をする必要がある。

version https://git-lfs.github.com/spec/v1
oid sha256:xxxxxxxxe127e0282f9ea8xxxxxxxxx4ee421407ba90d5c588dd0c0xxxxxxxx
size 250820

(sha256 の部分は適当にx埋めしたけど意味があるのかな)

Git のコマンドと Git LFS の挙動について

git push

これまでの Git と同じ + 変更された Git LFS 対象のファイルも Push する。ただし、Git LFS にはバージョンという概念は存在しないっぽいので、プロジェクト全体に影響を与えるので注意

git pull

これまでの Git と同じだが、Git pull したときは Git LFS のファイルがローカルに落ちてくるわけではない。なので、Git LFS 対象のファイルは特に変更されない(反映されない)。

Git LFS のファイルをローカルに落とすには?

git lfs pull

Git LFS 対象のファイルをローカルにダウンロードする。checkout は自動的にやってくれないっぽいので、pull しただけではローカルのリポジトリに反映してくれない。

git lfs checkout

Git LFS 対象のファイルをローカルに反映する。

コマンドラインではどうやるの?

Mac デフォルトの git では、Git LFS を導入したリポジトリを操作すると怒られる(スクショ取るの忘れた)ので、brew でちゃちゃっと git-lfs をインストール。

Source Tree ではどうやるの?

Source Tree は、元から Git LFS が入っているっぽい。

メニュー > リポジトリ > Git LFS で操作可能
source.png