Git LFS とは?
Git LFS (Large File Storage) は、画像や動画などの巨大なファイルをGitで効率的に扱うための拡張機能です。リポジトリが巨大化し、動作が遅くなるのを防ぎます。
任意の方法でインストールし、対象のリポジトリで git lfs install すると使用できます。
https://git-lfs.com/
$ cd path/to/repository
$ git lfs install
使い方
本記事は具体的な2つのユースケースを題材に、下記のコマンドについて扱っています。
- これから追加するファイルをGit LFSで管理する:
git lfs track - 過去にコミットされたファイルをGit LFSで管理する:
git lfs migrate
これから追加するファイルをGit LFSで管理する
1. Git LFSで管理するファイルの種類を指定する
拡張子がpsdのファイルをGit LFSで管理する場合
$ git lfs track "*.psd"
このコマンドを実行すると、リポジトリのルートに .gitattributes というファイルが作成(または追記)されます。このファイルには、.psd ファイルをLFSで管理するための設定が書き込まれます。
*.psd filter=lfs diff=lfs merge=lfs -text
2. .gitattributes ファイルをコミットする
LFSの設定をリポジトリに反映させるためコミットをする。
$ git add .gitattributes
$ git commit
3. 対象のファイルを追加してコミットする
以降、拡張子がpsdのファイルをコミットするとGit LFSで管理されます。
$ git add hoge.psd
$ git commit
# Git LFS管理されているファイルを一覧表示させる
$ git lfs ls-files
3b2cc23011 * hoge.psd
過去にコミットされたファイルをGit LFSで管理する
git lfs track での設定は、それ以降にコミットされるファイルにしか適用されません。既にGitの履歴に直接コミットされてしまった巨大なファイルをLFSに移行するには git lfs migrate コマンドを使います。
$ git lfs migrate import --everything --include="*.psd"
すべてのブランチとタグ (--everything) を対象に、過去のコミット履歴に含まれる .psd ファイルをすべて検索し、Git LFSの管理下に置き換えます。
注意点: コミット履歴が書き換えられます
git lfs migrate を実行すると、対象ファイルを含むコミット、およびそれ以降のすべてのコミット履歴が書き換えられます(コミットハッシュが変わります)。
なぜ巨大なファイルをGitで直接管理してはいけないのか?
Gitで巨大なファイルを直接管理すると、主に「リポジトリの肥大化」と、それに伴う「パフォーマンスの低下」という問題が発生します。
Gitは画像、動画、音声などの差分管理に難があります。
上記バイナリファイルを少しでも変更すると、Gitは差分ではなく、変更後のファイル全体を新しいデータとして履歴に保存してしまいます。
具体例
- 100MBのPSDファイルをコミットする。
- そのPSDファイルを少し修正して、再度コミットする。
- さらに修正して、またコミットする。
この時点で、リポジトリの履歴内(.gitディレクトリ)には、見た目上はファイルが1つでも、実質的に約300MB(100MB × 3つのバージョン)のデータが溜め込まれてしまいます。これを繰り返すと、リポジトリは肥大化しやすいです。
上記は問題は1例ですが、Git LFSを使用すると、Git内部でテキスト・ポインタに置き換え、ファイルの実体は、GitHubやGitLabなどが提供する専用のLFSストレージに別途保存します。