Gitで管理している大きいファイルをGit LFSに移行する話

ラージファイルをバージョン管理する場合には、通常のGitではなくその拡張機能であるGit LFS (Large File Storage) なるものを使用した方がよいとの情報を目にしたので、今までリポジトリにぶち込んでいたクソデカ.ncファイルをLFSに移行しました。その時のメモ。

Gitがどのようにファイルの差分を管理しているのか理解できてないですが、クソデカファイルに対してはLFSを使用することでgit clonegit pushgit 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)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です