facebook twitter hatena line email

Git/github/大きなファイル

提供: 初心者エンジニアの簡易メモ
移動: 案内検索

git lfsとは

大きいファイルをgitで管理する機能 brew install git-lfs

git lfsインストール

macの場合

$ brew install git-lfs
$ git lfs version
> git-lfs/2.13.3 (GitHub; darwin amd64; go 1.16.5)

参考:https://qiita.com/ikmski/items/5cc8b8832336b8d85429

linuxの場合

$ sudo yum install git-lfs
> git lfs version
> git-lfs/2.10.0 (GitHub; linux amd64; go 1.17.12)

gitリポジトリにlfs機能を追加

lfsを初めて使うリポジトリで必須

$ git lfs install

lfs対象ファイルを追加

pngの場合は

git lfs track "*.png"

以下.gitattributesが追加される

cat .gitattributes
*.png filter=lfs diff=lfs merge=lfs -text

追加してコミット

git add test.png
git commit -m "add image"

100MB以上のファイルをpushしたときのエラー対応方法

remote: error: GH001: Large files detected. You may want to try Git Large File Storage

Git LFS のインストール(macであれば)

brew install git-lfs

既にコミット済みの場合は、git履歴を消しておく

$ git filter-repo --force --invert-paths --path hogehoge/Libraries/libil2cpp.a
$ git filter-repo --force --invert-paths --path "Assets/TypingSystem/Fonts/NotoSansJP-Regular SDF.asset" 

.gitattributesに100MB超えのファイルを追加(例:hogehoge/Libraries/libil2cpp.a、スペース有りのファイル)

$ git lfs track hogehoge/Libraries/libil2cpp.a
$ git lfs track "Assets/TypingSystem/Fonts/NotoSansJP-Regular SDF.asset" #スペース有りのファイルは"で囲む
$ cat .gitattributes # 確認
hogehoge/Libraries/libil2cpp.a filter=lfs diff=lfs merge=lfs -text

(例:Assets/Firebase/Plugins/x86_64/FirebaseCppApp-11_6_0.bundleで、拡張子指定だけの場合)

Assets/Firebase/Plugins/x86_64/*.bundle filter=lfs diff=lfs merge=lfs -text

ファイルをaddしpushする

git add .gitattributes
git push origin master

対象ファイルを `git log` してgitattributes登録前にファイルをcommitしている箇所があれば失敗するので、以下のようなロールバックですべて戻す必要がある

git reset --soft HEAD^

参考:https://qiita.com/kanaya/items/ad52f25da32cb5aa19e6

lfsが登録できない場合

以下ls-filesが表示されないときは、lfsに登録されてない

git lfs ls-files
git lfs ls-files --size # サイズ表示したい場合はこちら
git lfs ls-files --all # 登録したファイル履歴も全部を出したい

すべてのgit履歴をスキャンし、該当ファイルを LFS に移行

git lfs migrate import --include="Assets/Firebase/Plugins/x86_64/FirebaseCppApp-11_8_0.bundle"

上記追加してもls-filesに表示されない場合は、以下を実行してるか確認。

git lfs install

lfs登録でファイルサイズがおかしくなってシステムが動かなくなったとき

# サイズ確認
$ ls -lh Assets/Firebase/Plugins/x86_64/FirebaseCppApp-11_8_0.bundle
134B  Assets/Firebase/Plugins/x86_64/FirebaseCppApp-11_8_0.bundle

# ポインタから、ファイル実体化
$ git lfs checkout Assets/Firebase/Plugins/x86_64/FirebaseCppApp-11_8_0.bundle

失敗する場合は、 git lfs install が入ってるか確認。

不要なlfsファイルを消す

# 現状ファイル確認
git lfs ls-files --all

# ファイル削除
git filter-repo --force --invert-paths --path "data.tar.gz"

# LFSクリーンアップ
git lfs prune

# 強制プッシュ
git push origin --force --all

現在使用されてるlfsファイルの確認

  • がついてるものが、現在使用されてるもの
$ git lfs ls-files --all --size

a3c8ab3999 * Assets/App/Fonts/NotoSansJP-Regular SDF.asset (10 MB)
538c67ab44 * Assets/Firebase/Plugins/x86_64/FirebaseCppApp-11_8_0.bundle (163 MB)
1a525309ec * docs/thumbnail.key (66 MB)
d7171aa817 * Assets/Firebase/Plugins/x86_64/FirebaseCppApp-11_8_0.so (92 MB)
85a3c6fa36 - Assets/App/Fonts/NotoSansJP-Regular SDF.asset (10 MB)
83b3e3c35c - Assets/App/Fonts/NotoSansJP-Regular SDF.asset (10 MB)
44776d35a9 - docs/thumbnail.key (66 MB)
0cceab3263 - Assets/App/Fonts/NotoSansJP-Regular SDF.asset (37 MB)

未使用のlfsファイルを削除

# 未使用ファイル - の確認
git lfs ls-files --all --size
9a43e2443a - docs/thumbnail.key (85 MB)
0db4c48f6c - docs/thumbnail.key (83 MB)

# 未使用のlfsファイルを削除
git filter-repo \
  --blob-callback '
    if b"9a43e2443a" in blob.data:
      blob.skip()
  ' \
  --force

# 未使用ファイル - がなくなってることの確認
git lfs ls-files --all --size
0db4c48f6c - docs/thumbnail.key (83 MB)

複数削除したい場合

git filter-repo \
  --blob-callback '
    if b"9a43e2443a" in blob.data:
      blob.skip()
    if b"0db4c48f6c" in blob.data:
      blob.skip()
  ' \
  --force