Gitで管理している大きいファイルをGit LFSに移行する話
ラージファイルをバージョン管理する場合には、通常のGitではなくその拡張機能であるGit LFS (Large File Storage) なるものを使用した方がよいとの情報を目にしたので、今までリポジトリにぶち込んでいたクソデカ.nc
ファイルをLFSに移行しました。その時のメモ。
Gitがどのようにファイルの差分を管理しているのか理解できてないですが、クソデカファイルに対してはLFSを使用することでgit clone
、git push
、git pull
等のパフォーマンスを改善できるそうです。
Git LFSをインストールする
Gitは既にインストールされており、各種設定は済んでいるとして話を進めます。
Windowsでの手順になりますので、他のプラットフォームの方は適宜ググってくだせえ
1. LFSのインストーラーをダウンロードしてくる。
2. インストーラー(.exe
)を実行する。
3. ターミナル(Powershell、Git Bash等)で下記を実行する。
git lfs install
履歴から対象ファイルを削除する
対象リポジトリに移動した後、 Git 履歴から移行対象のファイルを削除します。私は git filter-branch
を使いましたが、BFG Repo-Cleanerというのでもできるそうです。
cd [REPOSITORY DIR]
git filter-branch --index-filter 'git rm --cached --ignore-unmatch *.nc' HEAD
私はリポジトリで管理しているすべての .nc
ファイルを移行したかったのでこのようなコードになっています。適宜、目的に応じて読み替えてください。*.nc
のアスタリスクはワイルドカードというやつで、ファイル名が <任意の文字列>.nc
であるものをすべて拾ってくれます。
ちなみに、リポジトリにコミットしていないファイルがあるとエラー吐きます。
> Cannot rewrite branches: You have unstaged changes.
Git LFSにファイルをプッシュする
ファイルを Git LFS と関連付けます。
Git LFS に関連付けたいファイルタイプはすべて git lfs track
で追加する必要があります。
git lfs track "*.nc"
> Adding path *.nc
git lfs track
は、リポジトリのを書き換えるみたいです。作業はこれで完了です!あとは普段通り add
なり commit
なりすれば、関連付けたファイルはすべてGit LFSにプッシュされます。
ヒント: ローカルの .gitattributes ファイルをリポジトリにコミットするよう強くおすすめします。 Git LFS に関連付けられているグローバルな .gitattributes ファイルを利用すると、他の Git プロジェクトにコントリビュートする際にコンフリクトを起こすことがあります。
Git Large File Storage を設定する – GitHub Docs
ということなので、 .gitattributes
ファイルも忘れずにコミットしましょう。
今回は以上です。おやすみなせ。
参考文献
リポジトリのファイルを Git Large File Storage に移動する – GitHub Docs
Gitでバイナリファイルを扱ってしまい容量が増えてしまったときの対策 – なんとかするから、なんとかなる (hatenablog.com)