這篇文章為大家帶來了GIT倉庫瘦身及GIT LFS遷移說明的相關知識,希望對大家有幫助。
之前一些git專案上 CI/CD,發現jenkins git clone失敗,設定depth及clone時間之類的無果。只能考慮倉庫瘦身之類的策略。發現倉庫有不少的二進位文件,而這些二進位檔案變更還挺頻繁,這種操作會導致git倉庫成倍增長極速膨脹,git本身只適合管理文字檔案。
另外說一則有趣的往事,之前有個同事是圖形編程,這個語言源碼是圖片形式的,而且一個文件又特別大,上git管理,小公司項目變更又頻繁,導致沒多久公司內部搭的git伺服器硬碟居然就給他的幾個git倉庫給佔滿了。
雖然git一直不適合管理二進位文件,不過現在 git 也好像預設提供了git lfs 這個專門用來管理大文件的插件。
基本原理簡單來說就是使用類似一個文件指針(文本)代替實際的文件存儲,git只存儲文件指針的變更歷史而不是整個二進製文件,並且在使用的時候,自動提供hook,方便在如clone、pull、reset等操作會自動去取得這些文件指標的來源二進位文件,同樣更新二進位檔案commit的時候,git 會自動將來源檔案轉成檔案指標進git log,同時原始檔上傳lfs。所以在使用者層面,GIT LFS的使用其實是無感覺的。
上面簡單介紹了一下GIT LFS,接下來直接將如何遷移,至於為什麼直接講遷移而不是從0開始如何使用LFS。
是因為往往是git倉庫用著用著發現,倉庫好大、clone好慢,然後才是想著用LFS。
遷移需要我們有倉庫的管理員權限,並且將保護分支之類取消保護;
具體LFS遷移主要分為以下幾步。
遷移前最好做好備份,並且和團隊同事溝通好,畢竟操作涉及-f高風險操作,容易背鍋。
部分自建置git 服務的話,可能需要服務端設定開啟LFS,例如gitlab。
windows 的git安裝包自備了該插件,不需要另外安裝,其他平台可自行安裝,連結。
在命令列嘗試以下命令。
git lfs
如果有類似help文件資訊輸出,就是已經有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>
而後需要執行以下指令設定LFS全域環境,只需要設定一次,同時也會去更新目前倉庫的hooks
git lfs install
lfs遷移基本概念:lfs重寫本地歷史—>force push覆寫遠端,達到遷移的效果。
所以我們最好將本地倉庫與遠端同步,並且將所有的遠端分支都創建本地分支;
而後cd到自己本地倉庫,執行以下下命令,–include裡面是glob表達式,自行加入想LFS管理的檔名,–everything代表所有本地分支
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.
重寫完本地分支、tag之類的,
我們在這裡可以先執行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的遷移會重寫所有的commit,並且修改hash值,因此需要我們需要加上–froce
這一步驟需要取消保護分支(保護分支無法-f)
git push --force --all
這樣遠端倉庫的lfs遷移就完成了
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遷移說明的詳細內容。更多資訊請關注PHP中文網其他相關文章!