この記事では、GIT ウェアハウスのスリム化と GIT LFS の移行手順に関する関連知識を提供します。お役に立てば幸いです。
いくつかの git プロジェクトで CI/CD を使用したところ、jenkins git clone が失敗し、深さとクローン時間の設定が失敗したことがわかりました。倉庫の縮小などの戦略を考えるしかない。ウェアハウスには多数のバイナリ ファイルがあり、これらのバイナリ ファイルは非常に頻繁に変更されることがわかりました。この操作により、git ウェアハウスは急激に増大し、急速に拡張されます。Git 自体はテキスト ファイルの管理にのみ適しています。
もう一つの興味深い過去の話をさせてください。私にはかつてグラフィックス プログラミングに夢中だった同僚がいました。この言語のソース コードは画像の形式であり、ファイルは非常に大きかったです。私は小規模な会社のプロジェクトは頻繁に変更される可能性があり、その結果、社内の Git サーバーのハードディスクがいくつかの Git ウェアハウスでいっぱいになるまでにどれくらい時間がかかりましたか?
git はバイナリ ファイルの管理には決して適していませんでしたが、現在では、git は大きなファイルの管理に特化したプラグインである git lfs をデフォルトで提供しているようです。 。
基本原則は、実際のファイル ストレージの代わりにファイル ポインター (テキスト) を使用することです。Git は、バイナリ ファイル全体ではなくファイル ポインターの変更履歴のみを保存し、使用時に自動的にフックを提供します。これらのファイル ポインターのソース バイナリ ファイルを自動的に取得するには、クローン、プル、リセットなどの操作に便利です。同様に、バイナリ ファイルのコミットを更新するときに、git はソース ファイルを自動的にファイル ポインターに変換して入力します。 git log に保存され、同時にソースファイルが lfs にアップロードされます。したがって、ユーザー レベルでは、GIT LFS の使用は実際には無意味です。
上記では GIT LFS について簡単に紹介し、次に移行方法について直接説明します。なぜ最初から LFS を使用するかではなく移行について直接説明するのかについてです。
これは、git ウェアハウスを使用しているときに、ウェアハウスが非常に大きく、クローン作成が非常に遅いことに気づき、LFS の使用を検討することがよくあるためです。
移行には、ウェアハウスの 管理者権限が必要であり、保護されたブランチの保護を解除する必要があります;
具体的な LFS 移行は、主に次の手順に分かれています。
移行前にバックアップを作成し、チームの同僚とよくコミュニケーションをとることが最善です。結局のところ、この操作にはリスクの高い操作が含まれており、責任を負うことは簡単です。
GIT LFS サーバー構成いくつかの自己構築 git サービスを構築する場合は、gitlab などのサーバー側で LFS を有効にする必要がある場合があります。 GIT LFS クライアントのインストールWindows 用の git インストール パッケージには、このプラグインが付属しています。追加のインストールは必要ありません。他のプラットフォームは、それ自体をインストールしてリンクできます。 コマンド ラインで次のコマンドを試してください。git lfsヘルプドキュメントと同様の情報出力がある場合は、すでに git lfs クライアントが存在することを意味します。
git-lfs/2.11.0 (GitHub; windows amd64; go 1.14.2; git 48b28d97)git lfs <command> [<args>]Git LFS is a system for managing and versioning large files in association with a Git repository. Instead of storing the large files within the Git repository as blobs, Git LFS stores special "pointer files" in the repository, while storing the actual file contents on a Git LFS server. The contents of the large file are downloaded automatically when needed, for example when a Git branch containing the large file is checked out.Git LFS works by using a "smudge" filter to look up the large file contents based on the pointer file, and a "clean" filter to create a new version of the pointer file when the large file's contents change.It also uses a pre-push hook to upload the large file contents to the Git LFS server whenever a commit containing a new large file version is about to be pushed to the corresponding Git server.</args></command>
ローカル履歴ウェアハウスを移行する
次に、ローカル ウェアハウスに cd して次のコマンドを実行します。 -include には glob 式が含まれており、 LFS に自分で管理させたいファイル名 – すべてはすべてのローカル ブランチを表します
git lfs migrate import --include="*.bin,*.lib,*.so,*.dll,*.a,*.param,*.zip,*.gz" --everything
migrate: Sorting commits: ..., done. migrate: Rewriting commits: 100% (193/193), done. develop bacb490a80ea46d73bd3866c2e7cf7ad199ce5eb -> 72884bcb4629417bad73ea3d485d08a0708909cd feature/npu-platform a3645632756becc527c7f4d58514b3c479f824d3 -> e227900a3903b3a6955e4dffee48daeceac6cdff master 1ccdecdcb4b5d6224a6e24c6f87793bfcc15ee4c -> 1d9fc2139600ef3d92a20d65bb5db89021b8c488 0.1.0 07c6b2aa732506f1cc88cedb551f37f376b6efa6 -> 8e55193221dfca9f6bb28ccd9cca85af9c5958c9 1.0.0 0f694efcd7aa9df641836e1ea6eebbb730b940b5 -> 3f9e77575120b6e56b34790c998a362116da75f5 migrate: Updating refs: ..., done.
ここで最初に
git lfs を実行できます ls -filesどのファイルが lfs 管理に変換されたかを確認し、漏れがないか確認してください
現時点では、どのブランチにいても、.gitattributes ファイルは次のようなものが表示され、追加されます。
*.bin filter=lfs diff=lfs merge=lfs -text *.lib filter=lfs diff=lfs merge=lfs -text *.so filter=lfs diff=lfs merge=lfs -text *.dll filter=lfs diff=lfs merge=lfs -text *.a filter=lfs diff=lfs merge=lfs -text *.param filter=lfs diff=lfs merge=lfs -text *.zip filter=lfs diff=lfs merge=lfs -text *.gz filter=lfs diff=lfs merge=lfs -text
同時に、すべてのバイナリ ファイルが次の形式のテキストに変換されたことがわかります。
version https://git-lfs.github.com/spec/v1 oid sha256:9171c8350d72ccca6ad60ac80b577157ad1f9fd44ca05744216e02ccbfcdf491 size 10260
それが正しいことを確認してから、リモート エンド;
lfs の移行はすべてのコミットを書き換えるため、ハッシュ値が変更されるため、-froce を追加する必要があります この手順では、保護されたブランチをキャンセルする必要があります (保護されたブランチを -f にすることはできません)
git push --force --all
git lfs pull
git reflog expire --expire-unreachable=now --all git gc --prune=now
lfs直观来讲更多的是针对仓库大clone慢的问题,我这边lfs迁移前后各备份各一个小型远程仓库做测试,
用的测试仓库二进制文件比较小,总大50m内,且变更次数也在个位数。
clone下来的仓库大小对比。
和我预估差不多,总的来说更适合二进制文件频繁变更,如果单纯是文件大,但文件不变更的话,在clone的时候区别不大,毕竟lfs在clone仍有下载源文件的步骤,除开下载,操作文件指针对git来说理论仍会有性能提升,但是可能感知不强。
推荐学习:《Git教程》
以上がGIT ウェアハウスのスリム化と GIT LFS の移行手順を 10 分で学習しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。