欧美亚洲中文,在线国自产视频,欧洲一区在线观看视频,亚洲综合中文字幕在线观看

      1. <dfn id="rfwes"></dfn>
          <object id="rfwes"></object>
        1. 站長(zhǎng)資訊網(wǎng)
          最全最豐富的資訊網(wǎng)站

          十分鐘學(xué)會(huì)GIT倉(cāng)庫(kù)瘦身及GIT LFS遷移說(shuō)明

          本篇文章給大家?guī)?lái)了關(guān)于GIT倉(cāng)庫(kù)瘦身及GIT LFS遷移說(shuō)明的相關(guān)知識(shí),希望對(duì)大家有幫助。

          十分鐘學(xué)會(huì)GIT倉(cāng)庫(kù)瘦身及GIT LFS遷移說(shuō)明

          背景

          之前一些git項(xiàng)目上 CI/CD,發(fā)現(xiàn)jenkins git clone失敗,設(shè)置depth及clone時(shí)間之類的無(wú)果。只能考慮倉(cāng)庫(kù)瘦身之類的策略。發(fā)現(xiàn)倉(cāng)庫(kù)有不少的二進(jìn)制文件,且這些二進(jìn)制文件變更還挺頻繁,這種操作會(huì)導(dǎo)致git倉(cāng)庫(kù)成倍增長(zhǎng)極速膨脹,git本身只適合管理文本文件。

          另外說(shuō)一則有趣的往事,之前有個(gè)同事是圖形編程,這個(gè)語(yǔ)言源碼是圖片形式的,而且一個(gè)文件又特別大,上git管理,小公司項(xiàng)目變更又頻繁,導(dǎo)致沒(méi)多久公司內(nèi)部搭的git服務(wù)器硬盤居然就給他的幾個(gè)git倉(cāng)庫(kù)給占滿了。

          GIT LFS (Large File Storage)

          雖然git一直不適合管理二進(jìn)制文件,不過(guò)現(xiàn)在 git 也好像默認(rèn)提供了git lfs 這個(gè)專門用來(lái)管理大文件的插件。

          基本原理簡(jiǎn)單來(lái)說(shuō)就是使用類似一個(gè)文件指針(文本)代替實(shí)際的文件存儲(chǔ),git只存儲(chǔ)文件指針的變更歷史而不是整個(gè)二進(jìn)制文件,并且在使用的時(shí)候,自動(dòng)提供hook,方便在如clone、pull、reset等操作會(huì)自動(dòng)去獲取這些文件指針的源二進(jìn)制文件,同樣更新二進(jìn)制文件commit的時(shí)候,git 會(huì)自動(dòng)將源文件轉(zhuǎn)成文件指針進(jìn)git log,同時(shí)源文件上傳lfs。所以在用戶層面,GIT LFS的使用其實(shí)是無(wú)感的。

          遷移

          上面簡(jiǎn)單介紹了一下GIT LFS,接下來(lái)直接將如何遷移,至于為什么直接講遷移而不是從0開始如何使用LFS。
          是因?yàn)橥莋it倉(cāng)庫(kù)用著用著發(fā)現(xiàn),倉(cāng)庫(kù)好大、clone好慢,然后才是想著用LFS。

          遷移需要我們有倉(cāng)庫(kù)的管理員權(quán)限,并且將保護(hù)分支之類取消保護(hù);
          具體LFS遷移主要分為以下幾步。

          遷移前最好做好備份,并且和團(tuán)隊(duì)同事溝通好,畢竟操作涉及-f高危操作,容易背鍋。

          GIT LFS 服務(wù)端配置

          部分自建git 服務(wù)的話,可能需要服務(wù)端配置開啟LFS,比如gitlab。

          GIT LFS 客戶端安裝

          windows 的git安裝包自帶了該插件,不需要另外安裝,其他平臺(tái)可自行安裝,鏈接。

          在命令行嘗試以下命令。

          git lfs

          如果有類似help文檔信息輸出,就是已經(jīng)有g(shù)it 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.

          而后需要執(zhí)行以下命令配置LFS全局環(huán)境,只需要配置一次,同時(shí)也會(huì)去更新當(dāng)前倉(cāng)庫(kù)的hooks

          git lfs install

          遷移本地歷史倉(cāng)庫(kù)

          lfs遷移基本思想:lfs重寫本地歷史—>force push覆寫遠(yuǎn)端,達(dá)到遷移的效果。
          所以我們最好將本地倉(cāng)庫(kù)與遠(yuǎn)端同步,并且將所有的遠(yuǎn)端分支都創(chuàng)建本地分支;
          而后cd到自己本地倉(cāng)庫(kù),執(zhí)行以下下命令,–include里面是glob表達(dá)式,自行添加想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之類的,

          我們?cè)谶@里可以先執(zhí)行 git lfs ls-files查看有哪些文件被轉(zhuǎn)成了lfs管理,檢查是否有遺漏
          十分鐘學(xué)會(huì)GIT倉(cāng)庫(kù)瘦身及GIT LFS遷移說(shuō)明

          這個(gè)時(shí)候無(wú)論在哪個(gè)分支,都會(huì)出現(xiàn) .gitattributes 文件,且都會(huì)被添加上類似以下內(nèi)容。

          *.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

          同時(shí)可以看到我們二進(jìn)制文件全部都轉(zhuǎn)成了以下形式文本

          version https://git-lfs.github.com/spec/v1 oid sha256:9171c8350d72ccca6ad60ac80b577157ad1f9fd44ca05744216e02ccbfcdf491 size 10260

          確認(rèn)無(wú)誤,之后就可以推送到遠(yuǎn)端;
          由于lfs的遷移會(huì)重寫所有的commit,并且修改hash值,因此需要我們需要加上–froce
          這步需要取消保護(hù)分支(保護(hù)分支無(wú)法-f)

          git push --force --all

          這樣遠(yuǎn)程倉(cāng)庫(kù)的lfs遷移就完成了

          遷移一些補(bǔ)充說(shuō)明

          1. 遷移者的本地倉(cāng)庫(kù)lfs文件轉(zhuǎn)源文件:經(jīng)過(guò)以上步驟,由于我們將所有文件都已經(jīng)轉(zhuǎn)成文件指針,我們需要將文件下載回來(lái)才能正常使用該倉(cāng)庫(kù)。
            需要注意,其他人重新clone 或者同步 lfs遷移過(guò)的remote倉(cāng)庫(kù) 是不需要該步,只針對(duì)遷移作者本地的倉(cāng)庫(kù)。
          git lfs pull
          1. 團(tuán)隊(duì)中其他成員遷移前的本地倉(cāng)庫(kù)同步: 由于遠(yuǎn)程倉(cāng)庫(kù)的歷史已經(jīng)被全部重寫,所以無(wú)法直接同步,最好是刪除本地分支,重新拉取遠(yuǎn)程分支,如果本地已經(jīng)有部分commit需要提交,可以重名本地分支,拉取遠(yuǎn)程再做cherry pick。git tag 同理,刪除遷移前的tag。
          2. 本地倉(cāng)庫(kù)清理:上面的遷移成功將二進(jìn)制文件遷移成git lfs 對(duì)象,git log 也不在存儲(chǔ)源文件文件變更而是指針變更,但是在本地.git文件夾中仍存在之前不再需要的git log 緩存,執(zhí)行以下命令做清理。
          git reflog expire --expire-unreachable=now --all git gc --prune=now

          清理前后倉(cāng)庫(kù)對(duì)比

          lfs直觀來(lái)講

          贊(0)
          分享到: 更多 (0)
          網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)