GIT LFS遷移說明(範例詳解)

2022-03-16 19:00:33
本篇文章給大家帶來了關於的相關知識,其中主要介紹了GIT LFS的相關問題,包括了GIT LFS伺服器端設定、GIT LFS使用者端安裝、遷移本地歷史倉庫等等,希望對大家有幫助。

推薦學習:《》

之前一些git專案上 CI/CD,發現jenkins git clone失敗,設定depth及clone時間之類的無果。只能考慮倉庫瘦身之類的策略。發現倉庫有不少的二進位制檔案,且這些二進位制檔案變更還挺頻繁,這種操作會導致git倉庫成倍增長極速膨脹,git本身只適合管理文字檔案。

另外說一則有趣的往事,之前有個同事是圖形程式設計,這個語言原始碼是圖片形式的,而且一個檔案又特別大,上git管理,小公司專案變更又頻繁,導致沒多久公司內部搭的git伺服器硬碟居然就給他的幾個git倉庫給佔滿了。

GIT LFS (Large File Storage)

雖然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 伺服器端設定

部分自建git 服務的話,可能需要伺服器端設定開啟LFS,比如gitlab。

GIT LFS 使用者端安裝

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.

而後需要執行以下命令設定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遷移就完成了

遷移一些補充說明

  1. 遷移者的本地倉庫lfs檔案轉原始檔:經過以上步驟,由於我們將所有檔案都已經轉成檔案指標,我們需要將檔案下載回來才能正常使用該倉庫。
    需要注意,其他人重新clone 或者同步 lfs遷移過的remote倉庫 是不需要該步,只針對遷移作者原生的倉庫。
git lfs pull
  1. 團隊中其他成員遷移前的本地倉庫同步: 由於遠端倉庫的歷史已經被全部重寫,所以無法直接同步,最好是刪除本地分支,重新拉取遠端分支,如果本地已經有部分commit需要提交,可以重名本地分支,拉取遠端再做cherry pick。git tag 同理,刪除遷移前的tag。
  2. 本地倉庫清理:上面的遷移成功將二進位制檔案遷移成git lfs 物件,git log 也不在儲存原始檔檔案變更而是指標變更,但是在本地.git資料夾中仍存在之前不再需要的git log 快取,執行以下命令做清理。
git reflog expire --expire-unreachable=now --all
git gc --prune=now

清理前後倉庫對比

lfs直觀來講更多的是針對倉庫大clone慢的問題,我這邊lfs遷移前後各備份各一個小型遠端倉庫做測試,
用的測試倉庫二進位制檔案比較小,總大50m內,且變更次數也在個位數。
clone下來的倉庫大小對比。
和我預估差不多,總的來說更適合二進位制檔案頻繁變更,如果單純是檔案大,但檔案不變更的話,在clone的時候區別不大,畢竟lfs在clone仍有下載原始檔的步驟,除開下載,操作檔案指標對git來說理論仍會有效能提升,但是可能感知不強。
在這裡插入圖片描述推薦學習:《》

以上就是GIT LFS遷移說明(範例詳解)的詳細內容,更多請關注TW511.COM其它相關文章!