はじめに
Github で 100MB を超えるファイルを push しようとすると、↓のように怒られてしまい、push できずに終わってしまいます。 50MB を超えると Warning が出て、100MB を超えると Error になるようです。
そもそも、100MB を超えるようなファイルを Git で管理すべきなのか、とも思いますが、ここでは Git Large File Storege を使って Git で管理する場合の方法を紹介したいと思います。
Git Large File Storage (LFS)
概要
Git Large File Storage (LFS) を使うと、100MB を超えるファイルも管理することができます。ざっくり言うと、リポジトリに実際のファイルではなくファイルへの参照を保存することで管理します。実際のファイルは別のどこかに保存され、リポジトリには実際のファイルへのポインタファイルが格納されます。
「別のどこか」がどこなのか気になるのですが、公式ドキュメントには書いていなさそうでした。GitKraken のドキュメントには「カスタムサーバーかGithub, GitLab, BitBucket などの組み込み LFS ストレージ」と書いてあり、stack overflow の質問では、リモートのURLから git@github.com:foo/bar.git
-> https://github.com/foo/bar.git/info/lfs
というような規則で指定された場所に格納されると書かれていました。
使い方
インストール方法
公式の Github リポジトリに各環境ごとの Git LFS インストール方法が記載されています。私は Mac なので、 $ brew install git-lfs
でインストールできました。
Linux であれば Debian パッケージや RPM パッケージとして配布されており、 Windows であれば Git for Windows に初めから含まれているようです。
push 方法
100MB を超えるファイルをコミットしてしまっている場合は、まず下記のようにコマンドを叩いてコミットを取り消します。
$ git reset --soft HEAD^
コミットしていない場合は、この操作はしなくて大丈夫です。
次に、Git LFS のセットアップを行います。これは 1 アカウントで 1 回行うだけでよく、リポジトリごとに行う必要はありません。
$ git lfs install
セットアップできたら、 Git LFS に LFS で管理したいファイルを登録し、 .gitattributes を git add します。
$ git lfs add <100MB 超えのファイル名> $ git add .gitattributes
.gitattributes は、特定のファイルや拡張子ごとに適用する設定を記述するファイルのようなもので、ここでは $ git lfs add <ファイル名>
を行った際に自動的に Git LFS の設定が追記されるため、その変更を git add します。
ここからはいつも通りの操作を行うだけです。
$ git add <100MB 超えのファイル名> $ git commit -m "コミットメッセージ" $ git push
Git LFS への登録を行うのは初回のみでよいため、次からは普通に add や commit するだけで大丈夫です。
ストレージと帯域の制限
2023年9月19日時点では、無料アカウントでは Git LFS の無料ストレージは 1GB、無料帯域は 1GB/月 となっており、これらを超えて Git LFS を使用する場合は追加料金が必要となっています。 現在は 5ドル/月 で 50GB のストレージと帯域を購入できますが、2023年10月1日から Git LFS の課金モデルが変わるため、公式からの情報を参考にした方が良さそうです。
参考
- Git LFS in GitKraken Client | Store Binary Files
- git lfs - How to specify where Git LFS files will be stored? - Stack Overflow
- GitHub - git-lfs/git-lfs: Git extension for versioning large files
- Git Large File Storage の支払いについて - GitHub Docs
- Git Large File Storage | Git Large File Storage (LFS) replaces large files such as audio samples, videos, datasets, and graphics with text pointers inside Git, while storing the file contents on a remote server like GitHub.com or GitHub Enterprise.
- Git Large File Storageについて - GitHub Docs
- .gitattributes に関するメモ