Gitは大きなファイルの取り扱いは苦手です。
リポジトリサイズが肥大化し、クローンやプッシュに時間がかかる原因になります。
そこで登場するのが Git Large File Storage (LFS) です。
Git LFSは、大きなファイルをGitリポジトリに直接保存する代わり、
軽量なポインタを保存し、実際のファイルは別の場所に格納する仕組みです。
これにより、リポジトリサイズを小さく保ち、パフォーマンスを向上させることができます。
Git LFS の基本的な使い方
インストール
まずはGit LFSをインストールします。
方法はOSによって異なりますが、多くの場合パッケージマネージャでインストールできます。
例として、macOSではHomebrewを使って以下のようにインストールします。
git install install
リポジトリでの有効化
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
コマンドを適切に使い、過去のコミットを修正することで、リポジトリを健全な状態に保ちましょう。