概要説明します。
需要あるかわかりませんが、最近はGitHubも勉強しているため、自己啓発かねて書いていきます。
- Git LFSの説明
- GitHubの場合(使い方や制限等)
以下、目次となります!
Git LFSとは?
最初にGit LFSについて簡単に説明します。
- Gitは大容量ファイルの管理は不得意。
- Git内ではURL(ポインタ)だけ管理して、実体は別の場所に格納しよう。
え、これだけ?
はい。
不得意という言葉に対する具体的な症例として、操作が重くなるというのが一番でしょうか。(Gitにおいて管理ができなくなるってわけじゃありません。)
けど、GitHub、Gitlab、Backlog等のGitホスティングサービスでは、Gitリポジトリに大容量ファイルを突っ込まれても困るのか、容量制限があります。
→ 1ファイル辺りの容量制限(100MB等)があるため、LFSを使わざるを得なかったり、大容量ファイルを諦めたり、大容量ファイルは別のDropboxサービスで管理って流れになります。
GitHubの場合
GitHubでLFSについて
公式サイトの関連記事はこの辺りでしょうか。
数値関係をまとめておきますね(2023年時点)。
プラン | 1ファイル辺りの容量制限 | LFSストレージ (無償枠) | LFS帯域 (無償枠) | LFS利用時の 最大ファイルサイズ |
---|---|---|---|---|
Github.com (Free) | 100MB以上はだめ。 | 1GB | 1GB | 2GB |
Github.com (Team) | 100MB以上はだめ。 | 1GB | 1GB | 4GB |
GitHub enterprise Cloud | 100MB以上はだめ。 | 1GB | 12GB | 5GB |
GitHub enterprise Server | 特になし。 (設定値を設けることも可) | ー | ー | ? |
GitHubのPublicリポジトリだと色々な機能が無償で使えることがありますが、LFSはPublicリポジトリでもPrivateリポジトリと同じ制限です!
※Enterprise Cloudの場合はOrganizationの合計値になります。
以下はLFSに関する警告やエラー例です。
GitHub Desktopを利用している場合、コミット段階で次の警告が表示されます。
警告を無視してコミット後にプッシュすると、アップロードが終わった段階でErrorが表示されます(すぐにErrorにならない)。
なお、公式マニュアルによると、ファイル容量50MBを超えた段階で、GitHubから警告がくるようです。
LFSストレージ
LFS対象となったファイル置場(ストレージ)の最大容量です。
例えば、100MBのファイルを10個格納したら一杯です。
LFS帯域
LFSストレージからファイルをダウンロードした容量のことです。
「LFSサーバ」 → 「自分のPC」
等の転送時にLFS帯域を消費します。
例えば、100MBのファイルを10個アップロードする分には問題ありませんが、100MBのファイルを10個ダウンロードすると、すっからかんです。
Publicだとやばいかな?
一般利用者のダウンロードですぐに消費かな。
データパック
LFSストレージやLFS帯域は「データパック」を購入することで追加出来ます。
1パック5USD
- 50GBのLFSストレージ
- 50GBのLFS帯域
です。
Enterpriseの場合は、年間購入っぽいです(実際に購入したことは無くてEnterpriseを試験運用したときに確認)。
・・・ところで将来的にGitHubのLFSは重量課金制になるようです。
LFSのサーバについて
自前で準備も出来るようです。
例えば、LFSサーバをAWSのS3とする場合ですね。
→ 詳しくはググると、先輩方の実施記事がいくつも見つかりました。
けど管理を気を付けないと、面倒な割に、それなりに高額になるかも・・・。
S3ファイルのダウンロードがインターネットになる場合、データパックを購入するのと同じぐらいのコストです。
操作例
LFSをサポートしているGitホスティングサーバは結構ありますが、今回はGitHubを使いました。
初期設定
git lfsを導入していない場合は、別途導入しましょう。
Windowsであれば、以下からGitをデフォルトでインストールすれば入ります。
対象ファイルの設定は次の通り。
<リポジトリ内で初期設定>
$git lfs install
Updated Git hooks.
Git LFS initialized.
<対象ファイルを設定>
$git lfs track "*.exe"
Tracking "*.exe"
→ .gitattributesが生成されます。
<他の設定例>
$git lfs track "/this.exe" ← 特定階層のファイル指定
$git lfs track "/bin/*" ← 特定フォルダの全ファイル指定
この段階で関連ファイルをコミット&プッシュすれば準備完了です。
これら操作は代表者が最初に行えればOKです。
→ .gitattributesも一緒にリポジトリに入れば、他のクライアントでも同様に動作します(ただしlfsは必要)。
設定・状態の確認
<LFS trackの設定確認>
$git lfs track
Listing tracked patterns
*.exe (.gitattributes)
Listing excluded patterns
<LFSとして現在登録されているファイル>
$git lfs ls-files
914ffc96ce * this.exe
7f5678212b * that.exe
<LFSの候補ファイル>
$git lfs status
On branch main
Objects to be pushed to origin/main:
Objects to be committed:
Objects not staged for commit:
ところでgit lfs ls-filesを利用した場合に、ファイル名の左横が「*」だったり「-」だったりすることがありますが、次の通りです。
- 914ffc96ce * this.exeの場合:実体がある
- 914ffc96ce – this.exeの場合:実体がない(ポインタファイル)
「-」(ポインタファイル)の場合は、後からgit lfs pullを実行すれば実体がダウンロードされます。
Cloneの挙動
GitやGitHub Desktopの場合、LFSファイルも自動的にダウンロードされました。
大容量のLFSファイルも使うのであれば良いのですが、不要な場合、LFS帯域の節約のためにダウンロードしたくありません。
次のようなコマンドを実行しておくと、LFSファイルはポインタしかダウンロードしません。
$ git lfs install --skip-smudge
Git LFS initialized.
$ git config -l
→ filter.lfs.smudge=git-lfs smudge --skip -- %f
があれば設定OK
上記コマンドはリポジトリ内(.git)のフォルダじゃなくてOKです。
後から、ダウンロードしたい場合は、次のコマンドを実行します。
git lfs pull [ファイル名]
※ファイル名を指定してもしなくても全ファイルダウンロードかも。。
また、やっぱり最初から全部ダウンロードする設定に戻したい場合は、次のコマンドを実行します。
$ git lfs install
Git LFS initialized.
$ git config -l
→ filter.lfs.smudge=git-lfs smudge -- %f
その他
GitHubで制限を超過
GitHubでLFS帯域やストレージの制限を超えるとエラーが表示されます。
batch response: This repository is over its data quota. Account responsible for LFS bandwidth should purchase more data packs to restore access.
Uploading LFS objects: 0% (0/1), 0 B | 0 B/s, done.
error: failed to push some refs to 'https://github.com/...git'
x509: certificate signed by unknown authority
LFSファイルのダウンロードフェーズで「x509: certificate signed by unknown authority」が表示されてダウンロード出来ないことがありました(企業内だと多い?)
セキュリティ的によろしくありませんが、暫定で
git config –global http.sslverify false
とすることで回避出来ます。
まとめ
Git LFSに関する簡単な説明及び、GitHubでのLFSに関してざっくりとご紹介しました。
- 100MB以上のファイルはLFSの仕組みを使わないと管理出来ない。
- LFSにはストレージや帯域の制限があるため計画的に。
最後までご覧いただきありがとうございました。
コメント