Gitは大きなファイルの取り扱いは苦手です。
リポジトリサイズが肥大化し、クローンやプッシュに時間がかかる原因になります。
そこで登場するのが Git Large File Storage (LFS) です。
Git LFSは、大きなファイルをGitリポジトリに直接保存する代わり、
軽量なポインタを保存し、実際のファイルは別の場所に格納する仕組みです。
これにより、リポジトリサイズを小さく保ち、パフォーマンスを向上させることができます。
Git LFS の基本的な使い方
インストール
まずはGit LFSをインストールします。
方法はOSによって異なりますが、多くの場合パッケージマネージャでインストールできます。
例として、macOSではHomebrewを使って以下のようにインストールします。
git install git-lfs
リポジトリでの有効化
GitリポジトリでGit LFSを有効化します。
git lfs install
追跡対象ファイルの指定
どの種類のファイルをLFSで管理するかを指定します。例えば、.psd
ファイルをLFSで管理する場合:
git lfs track "*.psd"
これにより、.gitattributes
ファイルに設定が記述されます。このファイルもリポジトリで管理する必要があります。
ファイルの追加とコミット
通常のGitワークフローと同様に、ファイルをステージング、コミット、プッシュします。
git add .gitattributes
git add your-large-file.psd
git commit -m "Add large PSD file using LFS"
git push origin main
落とし穴: 事後登録の悲劇
先日、まさにこのGit LFSでハマってしまいました。
大きなファイルを既にコミットしてしまった後に、LFSに登録しようとしたのです。
具体的には、以下のような流れでした。
- 大きな動画ファイル
video.mp4
を普通にGitに追加・コミット・プッシュ。 - リポジトリが大きくなりすぎて問題が発生したため、Git LFSを導入することに。
-
git lfs track "*.mp4"
を実行して、MP4ファイルをLFSで追跡するように設定。 -
video.mp4
を再度git add
、コミット、プッシュしようとしたらエラーが発生!
なぜエラーになったのか? それは、既にGitの履歴に記録されている大きなファイルは、後からLFSに登録しても、LFSの仕組みで管理されるようにはならない からです。 LFSは、git lfs track
コマンド実行 以降 に追加されるファイルに対してのみ有効なのです。
解決策: ファイルのマイグレーション
この問題を解決するには、git lfs migrate
コマンドを使ってファイルをマイグレーションする必要があります。 具体的には以下の手順で解決しました。
- 対象のファイルをLFSで管理するように設定:
git lfs track "*.mp4"
- 履歴を書き換えて、過去のコミットから大きなファイルをLFSポインタに置き換える:
git lfs migrate import --include="*.mp4"
- リモートリポジトリに強制プッシュ:
git push --force-with-lease origin main
(※ 強制プッシュは注意して使用してください!)
まとめ
Git LFSは大きなファイルを扱う際に非常に便利ですが、既にコミットしたファイルを事後的にLFSで管理しようとする場合には注意が必要です。git lfs migrate
コマンドを適切に使い、過去のコミットを修正することで、リポジトリを健全な状態に保ちましょう。