Git LFS使用注意事項(xiàng)
本文主要介紹了使用Git LFS注意事項(xiàng),以及常見問題的處理方式。
版本過低導(dǎo)致的報(bào)錯(cuò)異常
Git相關(guān)軟件版本過低可能導(dǎo)致Git LFS功能無法正常使用(例如 batch 接口報(bào)錯(cuò)等),特別是Windows操作系統(tǒng)下默認(rèn)安裝的版本通常較低。因?yàn)樾吕习姹局g存在兼容性的問題,可能進(jìn)而引發(fā)類似HTTP調(diào)用異常的情況,導(dǎo)致LFS功能無法正常使用。遇到類似情況,請(qǐng)檢查并升級(jí)本地git和git-lfs版本為最新版本后再試, 通??梢皂樌鉀Q,下方為相關(guān)工具的下載地址:
git下載地址:https://git-scm.com/downloads。
git-lfs下載地址:https://github.com/git-lfs/git-lfs/releases。
未安裝git-lfs導(dǎo)致無法完整拉取文件
如果要拉取包含Git LFS文件的代碼倉庫,則必須在對(duì)應(yīng)環(huán)境安裝git-lfs
,具體可參見如何使用Git LFS?
示例說明:
場景1:用戶A本地推送若干Git LFS文件到遠(yuǎn)端成功。用戶B從遠(yuǎn)端拉取倉庫,同時(shí)用戶B環(huán)境未安裝
git-lfs
,則拉取后文件內(nèi)容為Git LFS Pointer文件內(nèi)容(version,oid和size),而無法將真正存儲(chǔ)在Git LFS的文件拉取到本地。場景2:用戶A本地推送若干Git LFS文件到遠(yuǎn)端成功,并且這些文件是CI/CD依賴的相關(guān)資源。CI/CD在構(gòu)建或者測試時(shí)失敗,原因是在CI/CD運(yùn)行的環(huán)境中沒有安裝
git-lfs
,導(dǎo)致拉取下來的文件為Git LFS Pointer文件而非真實(shí)文件。
如上場景均需要在本機(jī)或構(gòu)建機(jī)器上安裝git-lfs
,安裝后使用普通Git命令即可正常拉取完整服務(wù)端文件。
如何將歷史提交中的大文件遷移至Git LFS
如果Git存儲(chǔ)庫的提交歷史中已有大文件,則git lfs track
不會(huì)追溯跟蹤它們,而只會(huì)從新的提交開始應(yīng)用Git LFS。如果您希望遷移歷史提交記錄中的大文件到Git LFS,可以使用git lfs migrate
命令進(jìn)行遷移。
模擬將歷史提交中的bigfile后綴的文件,首先將bigfile后綴的pattern進(jìn)行untrack:
$git lfs untrack "*.bigfile"
Untracking "*.bigfile"
隨后,添加若干不同大小的多個(gè)bigfile文件,執(zhí)行git add
和git commit
后查看提交信息:
$git log -p
commit 1ca6e34006c6c1206563e8900d17c1503d9b4dce (HEAD -> test, origin/test)
Author: dyroneteng <tenglong***@alibaba-inc.com>
Date: Thu Sep 17 14:09:24 2020 +0800
old non LFS files
diff --git a/.gitattributes b/.gitattributes
index c441ad2..e69de29 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1 +0,0 @@
-*.bigfile filter=lfs diff=lfs merge=lfs -text
diff --git a/10m.bigfile b/10m.bigfile
new file mode 100644
index 0000000..6c5d403
Binary files /dev/null and b/10m.bigfile differ
diff --git a/11m.bigfile b/11m.bigfile
new file mode 100644
index 0000000..15ae5f2
Binary files /dev/null and b/11m.bigfile differ
diff --git a/12m.bigfile b/12m.bigfile
new file mode 100644
index 0000000..202d95c
Binary files /dev/null and b/12m.bigfile differ
diff --git a/13m.bigfile b/13m.bigfile
new file mode 100644
index 0000000..5b02d1f
Binary files /dev/null and b/13m.bigfile differ
diff --git a/14m.bigfile b/14m.bigfile
new file mode 100644
index 0000000..ad3b355
Binary files /dev/null and b/14m.bigfile differ
diff --git a/15m.bigfile b/15m.bigfile
new file mode 100644
index 0000000..a8510df
Binary files /dev/null and b/15m.bigfile differ
可以看到,在當(dāng)前的提交1ca6e34006c6c1206563e8900d17c1503d9b4dce
中,LFS untrack已經(jīng)生效,這是因?yàn)閎igfile的diff內(nèi)容不是Pointer文件內(nèi)容,而是二進(jìn)制文件。
隨后可以執(zhí)行git lfs migrate info
同時(shí)指定分支名作為參數(shù),查看該分支Git LFS的相關(guān)信息:
$git lfs migrate info --include-ref=refs/heads/test
migrate: Sorting commits: ..., done.
migrate: Examining commits: 100% (3/3), done.
*.bigfile 79 MB 7/7 files(s) 100%
*.gitattributes 46 B 1/2 files(s) 50%
具體遷移的方式,可以執(zhí)行git lfs migrate import
,同時(shí)指定--include-ref
指定分支名以及指定--include
指定遷移File Pattern作為參數(shù),進(jìn)行:
$git lfs migrate import --include-ref=/refs/heads/test --include="*.bigfile"
migrate: Sorting commits: ..., done.
migrate: Rewriting commits: 100% (3/3), done.
master 8032589f47a748171e84da94ce6440fe139e99f9 -> 8032589f47a748171e84da94ce6440fe139e99f9
test 1ca6e34006c6c1206563e8900d17c1503d9b4dce -> 7b1fbac772434d084b4681538602cdf69bf3d8ac
migrate: Updating refs: ..., done.
migrate: checkout: ..., done.
執(zhí)行上述的遷移命令,從標(biāo)準(zhǔn)輸出結(jié)果中可以看到,master
分支的版本沒有產(chǎn)生變化,因?yàn)椴⑽粗付ㄟw移master
分支,而遷移指定的test
分支版本已經(jīng)被更新為7b1fbac772434d084b4681538602cdf69bf3d8ac
:
$git show 7b1fbac772434d084b4681538602cdf69bf3d8ac
commit 7b1fbac772434d084b4681538602cdf69bf3d8ac (HEAD -> test)
Author: dyroneteng <tenglong***@alibaba-inc.com>
Date: Thu Sep 17 14:09:24 2020 +0800
old non LFS files
diff --git a/10m.bigfile b/10m.bigfile
new file mode 100644
index 0000000..f252459
--- /dev/null
+++ b/10m.bigfile
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e5b844cc57f57094ea4585e235f36c78c1cd222262bb89d53c94dcb4d6b3e55d
+size 10485760
### .......
### .......
### .......
### 省略部分輸出
在被覆蓋的提交7b1fbac772434d084b4681538602cdf69bf3d8ac
上,可以看到和之前的提交1ca6e34006c6c1206563e8900d17c1503d9b4dce
發(fā)生了變化,前者提交的實(shí)際二進(jìn)制文件差異不顯示,而后者已經(jīng)變?yōu)榱薌it LFS Pointer文件。最后,如果希望提交在遠(yuǎn)端生效,需要強(qiáng)制push到遠(yuǎn)端倉庫,執(zhí)行:
$git push --force
不建議一次性遷移倉庫的全部對(duì)象變更為Git LFS,可能會(huì)存在超時(shí)等未知情況,給出的建議為:按照指定分支的方式遷移,參數(shù)
--include-ref
。強(qiáng)烈建議在遷移Git LFS前在本地備份Git倉庫,即使遷移異常也可以完整回退到最初倉庫狀態(tài)。
git-lfs-migrate
的使用方式參見git-lfs-migrate遷移工具說明文檔。更多場景的詳細(xì)遷移指南參見LFS 遷移指南。