本文主要講解在 Git 倉庫中如何管理大的二進制文件,詳細介紹了什么是 Git LFS,Git LFS 是如何工作的,以及如何使用 Git LFS。
本文翻譯自 Atlassian 官方介紹 Git LFS 的文章,Atlassian 是 Git LFS 的主要開發者之一,這篇介紹 Git LFS 的文章比較權威,講的也很詳細。原文地址:
https://www.atlassian.com/git/tutorials/git-lfs
本文同時也加了我個人的一些注釋,注釋內容會明確用加粗字體標識出來。
什么是 Git LFS?
Git 是分布式 版本控制系統,這意味着在克隆過程中會將倉庫的整個歷史記錄傳輸到客戶端。對於包涵大文件(尤其是經常被修改的大文件)的項目,初始克隆需要大量時間,因為客戶端會下載每個文件的每個版本。Git LFS(Large File Storage)是由 Atlassian, GitHub 以及其他開源貢獻者開發的 Git 擴展,它通過延遲地(lazily)下載大文件的相關版本來減少大文件在倉庫中的影響,具體來說,大文件是在 checkout 的過程中下載的,而不是 clone 或 fetch 過程中下載的(這意味着你在后台定時 fetch 遠端倉庫內容到本地時,並不會下載大文件內容,而是在你 checkout 到工作區的時候才會真正去下載大文件的內容)。
Git LFS 通過將倉庫中的大文件替換為微小的指針(pointer) 文件來做到這一點。在正常使用期間,你將永遠不會看到這些指針文件,因為它們是由 Git LFS 自動處理的:
1. 當你添加(執行 git add 命令)一個文件到你的倉庫時,Git LFS 用一個指針替換其內容,並將文件內容存儲在本地 Git LFS 緩存中(本地 Git LFS 緩存位於倉庫的.git/lfs/objects 目錄中)。
2. 當你推送新的提交到服務器時,新推送的提交引用的所有 Git LFS 文件都會從本地 Git LFS 緩存傳輸到綁定到 Git 倉庫的遠程 Git LFS 存儲(即 LFS 文件內容會直接從本地 Git LFS 緩存傳輸到遠程 Git LFS 存儲服務器)。
\3. 當你 checkout 一個包含 Git LFS 指針的提交時,指針文件將替換為本地 Git LFS 緩存中的文件,或者從遠端 Git LFS 存儲區下載。
關於 LFS 的指針文件:
LFS 的指針文件是一個文本文件,存儲在 Git 倉庫中,對應大文件的內容存儲在 LFS 服務器里,而不是 Git 倉庫中,下面為一個圖片 LFS 文件的指針文件內容:
version https://git-lfs.github.com/spec/v1 oid sha256:5b62e134d2478ae0bbded57f6be8f048d8d916cb876f0656a8a6d1363716d999 size 285
指針文件很小,小於 1KB。其格式為 key-value 格式,第一行為指針文件規范 URL,第二行為文件的對象 id,也即 LFS 文件的存儲對象文件名,可以在.git/lfs/objects 目錄中找到該文件的存儲對象,第三行為文件的實際大小(單位為字節)。所有 LFS 指針文件都是這種格式。
Git LFS 是無縫的:在你的工作副本中,你只會看到實際的文件內容。這意味着你不需要更改現有的 Git 工作流程就可以使用 Git LFS。你只需按常規進行 git checkout、編輯文件、git add 和 git commit。git clone 和 git pull 將明顯更快,因為你只下載實際檢出的提交所引用的大文件版本,而不是曾經存在過的文件的每一個版本。
為了使用 Git LFS,你將需要一個支持 Git LFS 的托管服務器,例如Bitbucket Cloud或Bitbucket Server(GitHub、GitLab也都支持 Git LFS)。倉庫用戶將需要安裝 Git LFS 命令行客戶端(參考這里其實更好),或支持 Git LFS 的 GUI 客戶端,例如Sourcetree。
安裝 Git LFS
1. 有三種簡單的方式來安裝 Git LFS:
a. 用你最喜歡的軟件包管理器來安裝它。git-lfs 軟件包在 Homebrew,MacPorts,dnf 和packagecloud中都是可用的;或者
b. 從項目網站下載並安裝Git LFS;
c. 安裝 Sourcetree,它是捆綁了 Git LFS 的一個免費的 Git GUI 客戶端。
2. 一旦安裝好了 Git LFS,請運行 git lfs install 來初始化 Git LFS(如果你安裝了 Sourcetree,可以跳過此步驟):
$ git lfs install Git LFS initialized.
你只需要運行 git lfs install 一次。為你的系統初始化后,當你克隆包含 Git LFS 內容的倉庫時,Git LFS 將自動進行自我引導啟用。
創建一個新的 Git LFS 倉庫
要創建一個新的支持 Git LFS 的倉庫,你需要在創建倉庫后運行 git lfs install:
# initialize Git $ mkdir Atlasteroids $ cd Atlasteroids $ git init Initialized empty Git repository in /Users/tpettersen/Atlasteroids/.git/ # initialize Git LFS $ git lfs install Updated pre-push hook. Git LFS initialized.
這將在你的倉庫中安裝一個特殊的 pre-push Git 鈎子,該鈎子將在你執行 git push 的時候傳輸 Git LFS 文件到服務器上。
所有Bitbucket Cloud倉庫已自動啟用 Git LFS 。對於Bitbucket Server,你需要在倉庫設置中啟用 Git LFS:
當你的倉庫初始化了 Git LFS 后,你可以通過使用 git lfs track 來指定要跟蹤的文件。
克隆現有的 Git LFS 倉庫
安裝 Git LFS 后,你可以像往常一樣使用 git clone 命令來克隆 Git LFS 倉庫。在克隆過程的結尾,Git 將檢出默認分支(通常是 master),並且將自動為你下載完成檢出過程所需的所有 Git LFS 文件。例如:
$ git clone git@bitbucket.org:tpettersen/Atlasteroids.gitCloning into 'Atlasteroids'... remote: Counting objects: 156, done. remote: Compressing objects: 100% (154/154), done. remote: Total 156 (delta 87), reused 0 (delta 0) Receiving objects: 100% (156/156), 54.04 KiB | 31.00 KiB/s, done. Resolving deltas: 100% (87/87), done. Checking connectivity... done. Downloading Assets/Sprites/projectiles-spritesheet.png (21.14 KB) Downloading Assets/Sprites/productlogos_cmyk-spritesheet.png (301.96 KB) Downloading Assets/Sprites/shuttle2.png (1.62 KB) Downloading Assets/Sprites/space1.png (1.11 MB) Checking out files: 100% (81/81), done
倉庫里有 4 個 PNG 文件被 Git LFS 跟蹤。執行 git clone 命令時,在從倉庫中檢出指針文件的時候,Git LFS 文件被一個一個下載下來。
加快克隆速度
如果你正在克隆包含大量 LFS 文件的倉庫,顯式使用 git lfs clone 命令可提供更好的性能:
$ git lfs clone git@bitbucket.org:tpettersen/Atlasteroids.git Cloning into 'Atlasteroids'... remote: Counting objects: 156, done. remote: Compressing objects: 100% (154/154), done. remote: Total 156 (delta 87), reused 0 (delta 0) Receiving objects: 100% (156/156), 54.04 KiB | 0 bytes/s, done. Resolving deltas: 100% (87/87), done. Checking connectivity... done. Git LFS: (4 of 4 files) 1.14 MB / 1.15 MB
git lfs clone 命令不會一次下載一個 Git LFS 文件,而是等到檢出(checkout)完成后再批量下載所有必需的 Git LFS 文件。這利用了並行下載的優勢,並顯著減少了產生的 HTTP 請求和進程的數量(這對於提高 Windows 的性能尤為重要)。
拉取並檢出
就像克隆一樣,你可以使用常規的 git pull 命令拉取 Git LFS 倉庫。拉取完成后,所有需要的 Git LFS 文件都會作為自動檢出過程的一部分而被下載。
$ git pull Updating 4784e9d..7039f0a Downloading Assets/Sprites/powerup.png (21.14 KB) Fast-forward Assets/Sprites/powerup.png | 3 + Assets/Sprites/powerup.png.meta | 4133 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 4136 insertions(+) create mode 100644 Assets/Sprites/projectiles-spritesheet.png create mode 100644 Assets/Sprites/projectiles-spritesheet.png.meta
不需要顯式的命令即可獲取 Git LFS 內容。然而,如果檢出因為意外原因而失敗,你可以通過使用 git lfs pull 命令來下載當前提交的所有丟失的 Git LFS 內容:
$ git lfs pull Git LFS: (4 of 4 files) 1.14 MB / 1.15 MB
加快拉取速度
像 git lfs clone 命令一樣,git lfs pull 命令批量下載 Git LFS 文件。如果你知道自上次拉取以來已經更改了大量文件,則不妨顯式使用 git lfs pull 命令來批量下載 Git LFS 內容,而禁用在檢出期間自動下載 Git LFS。這可以通過在調用 git pull 命令時使用-c 選項覆蓋 Git 配置來完成:
$ git -c filter.lfs.smudge= -c filter.lfs.required=false pull && git lfs pull
由於輸入的內容很多,你可能希望創建一個簡單的Git 別名來為你執行批處理的 Git 和 Git LFS 拉取:
$ git config --global alias.plfs "\!git -c filter.lfs.smudge= -c filter.lfs.required=false pull && git lfs pull" $ git plfs
當需要下載大量的 Git LFS 文件時,這將大大提高性能(同樣,尤其是在 Windows 上)。
使用 Git LFS 跟蹤文件
當向倉庫中添加新的大文件類型時,你需要通過使用 git lfs track 命令指定一個模式來告訴 Git LFS 對其進行跟蹤:
$ git lfs track "*.ogg" Tracking *.ogg
請注意,"*.ogg"周圍的引號很重要。省略它們將導致通配符被 shell 擴展,並將為當前目錄中的每個.ogg 文件創建單獨的條目:
# probably not what you want $ git lfs track *.ogg Tracking explode.ogg Tracking music.ogg Tracking phaser.ogg
Git LFS 支持的模式與.gitignore 支持的模式相同,例如:
# track all .ogg files in any directory $ git lfs track "*.ogg" # track files named music.ogg in any directory $ git lfs track "music.ogg" # track all files in the Assets directory and all subdirectories $ git lfs track "Assets/" # track all files in the Assets directory but *not* subdirectories $ git lfs track "Assets/*" # track all ogg files in Assets/Audio $ git lfs track "Assets/Audio/*.ogg" # track all ogg files in any directory named Music $ git lfs track "**/Music/*.ogg" # track png files containing "xxhdpi" in their name, in any directory $ git lfs track "*xxhdpi*.png
這些模式是相對於你運行 git lfs track 命令的目錄的。為了簡單起見,最好是在倉庫根目錄運行 git lfs track。需要注意的是,Git LFS 不支持像.gitignore 那樣的負模式(negative patterns)。
運行 git lfs track 后,你會在你的運行命令的倉庫中發現名為.gitattributes 的新文件。.gitattributes 是一種 Git 機制,用於將特殊行為綁定到某些文件模式。Git LFS 自動創建或更新.gitattributes 文件,以將跟蹤的文件模式綁定到 Git LFS 過濾器。但是,你需要將對.gitattributes 文件的任何更改自己提交到倉庫:
$ git lfs track "*.ogg" Tracking *.ogg $ git add .gitattributes $ git diff --cached diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..b6dd0bb --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.ogg filter=lfs diff=lfs merge=lfs -text $ git commit -m "Track ogg files with Git LFS"
為了便於維護,通過始終從倉庫的根目錄運行 git lfs track,將所有 Git LFS 模式保持在單個.gitattributes 文件中是最簡單的。然而,你可以通過調用不帶參數的 git lfs track 命令來顯示 Git LFS 當前正在跟蹤的所有模式的列表(以及它們在其中定義的.gitattributes 文件):
$ git lfs track Listing tracked paths *.stl (.gitattributes) *.png (Assets/Sprites/.gitattributes) *.ogg (Assets/Audio/.gitattributes)
你可以通過從.gitattributes 文件中刪除相應的行,或者通過運行 git lfs untrack 命令來停止使用 Git LFS 跟蹤特定模式:
$ git lfs untrack "*.ogg" Untracking *.ogg $ git diff diff --git a/.gitattributes b/.gitattributes index b6dd0bb..e69de29 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +0,0 @@ -*.ogg filter=lfs diff=lfs merge=lfs -text
運行 git lfs untrack 命令后,你自己必須再次提交.gitattributes 文件的更改。
提交和推送
你可以按常規方式提交並推送到包含 Git LFS 內容的倉庫。如果你已經提交了被 Git LFS 跟蹤的文件的變更,則當 Git LFS 內容傳輸到服務器時,你會從 git push 中看到一些其他輸出:
$ git push Git LFS: (3 of 3 files) 4.68 MB / 4.68 MB Counting objects: 8, done. Delta compression using up to 8 threads. Compressing objects: 100% (8/8), done. Writing objects: 100% (8/8), 1.16 KiB | 0 bytes/s, done. Total 8 (delta 1), reused 0 (delta 0) To git@bitbucket.org:tpettersen/atlasteroids.git 7039f0a..b3684d3 master -> master
如果由於某些原因傳輸 LFS 文件失敗,推送將被終止,你可以放心地重試。與 Git 一樣,Git LFS 存儲也是內容尋址 的(而不是按文件名尋址):內容是根據密鑰存儲的,該密鑰是內容本身的 SHA-256 哈希。這意味着重新嘗試將 Git LFS 文件傳輸到服務器總是安全的;你不可能用錯誤的版本意外覆蓋 Git LFS 文件的內容。
在主機之間移動 Git LFS 倉庫
要將 Git LFS 倉庫從一個托管提供者遷移到另一個托管提供者序,你可以結合使用指定了-all 選項的 git lfs fetch 和 git lfs push 命令。
例如,要將所有 Git 和 Git LFS 倉庫從名為github
的遠端移動到名為bitbucket
的遠端:
# create a bare clone of the GitHub repository $ git clone --bare git@github.com:kannonboy/atlasteroids.git $ cd atlasteroids # set up named remotes for Bitbucket and GitHub $ git remote add bitbucket git@bitbucket.org:tpettersen/atlasteroids.git $ git remote add github git@github.com:kannonboy/atlasteroids.git # fetch all Git LFS content from GitHub $ git lfs fetch --all github # push all Git and Git LFS content to Bitbucket $ git push --mirror bitbucket $ git lfs push --all bitbucket
獲取額外的 Git LFS 歷史記錄
Git LFS 通常僅下載你實際在本地檢出的提交所需的文件。但是,你可以使用 git lfs fetch --recent 命令強制 Git LFS 為其他最近修改的分支下載額外的內容:
$ git lfs fetch --recent Fetching master Git LFS: (0 of 0 files, 14 skipped) 0 B / 0 B, 2.83 MB skipped Fetching recent branches within 7 days Fetching origin/power-ups Git LFS: (8 of 8 files, 4 skipped) 408.42 KB / 408.42 KB, 2.81 MB skipped Fetching origin/more-music Git LFS: (1 of 1 files, 14 skipped) 1.68 MB / 1.68 MB, 2.83 MB skipped
這對於在外出午餐時批量下載新的 Git LFS 內容很有用,或者如果你打算與隊友一起審查工作,並且由於網絡連接受限而無法在以后下載內容時,這將非常有用。 例如,你可能希望在上飛機之前先運行 git lfs fetch --recent!
Git LFS 會考慮包含最近提交超過 7 天的提交的任何分支或標簽。 你可以通過設置 lfs.fetchrecentrefsdays 屬性來配置被視為最近的天數:
# download Git LFS content for branches or tags updated in the last 10 days $ git config lfs.fetchrecentrefsdays 10
默認情況下,git lfs fetch --recent 將僅在最近分支或標記的最新提交下載 Git LFS 內容。
但是,你可以通過配置 lfs.fetchrecentcommitsdays 屬性,將 Git LFS 配置為在最近的分支和標簽上下載更早提交的內容:
# download the latest 3 days of Git LFS content for each recent branch or tag $ git config lfs.fetchrecentcommitsdays 3
請謹慎使用此設置:如果分支移動很快,則可能會導致下載大量數據。 但是,如果你需要查看分支上的插頁式更改,跨分支的 cherry-pick 提交或重寫歷史記錄,它可能會很有用。
如在主機之間移動 Git LFS 倉庫中所述,你還可以選擇使用 git lfs fetch --all 獲取倉庫的所有 Git LFS 內容:
$ git lfs fetch --all Scanning for all objects ever referenced... ✔ 23 objects found Fetching objects... Git LFS: (9 of 9 files, 14 skipped) 2.06 MB / 2.08 MB, 2.83 MB skipped
刪除本地 Git LFS 文件
你可以使用 git lfs prune 命令從本地 Git LFS 緩存中刪除文件:
$ git lfs prune ✔ 4 local objects, 33 retained Pruning 4 files, (2.1 MB) ✔ Deleted 4 files
這將刪除所有被認為是舊的本地 Git LFS 文件。 舊文件是以下未被引用的任何文件:
- 當前檢出的提交
- 尚未推送(到 origin,或任何 lfs.pruneremotetocheck 設置的)的提交
- 最近一次提交
默認情況下,最近的提交是最近十天內創建的任何提交。 通過添加以下內容計算得出:
- 獲取額外的 Git LFS 歷史記錄中討論的 lfs.fetchrecentrefsdays 屬性的值(默認為 7); 至
- lfs.pruneoffsetdays 屬性的值(默認為 3)
你可以配置 prune 偏移量以將 Git LFS 內容保留更長的時間:
# don't prune commits younger than four weeks (7 + 21) $ git config lfs.pruneoffsetdays 21
與 Git 的內置垃圾收集不同,Git LFS 內容不會自動修剪,因此,定期運行 git lfs prune 命令是保持本地倉庫大小減小的好主意。
你可以使用 git lfs prune --dry-run 來測試修剪操作將產生什么效果:
$ git lfs prune --dry-run ✔ 4 local objects, 33 retained 4 files would be pruned (2.1 MB)
以及使用 git lfs prune --verbose --dry-run 命令精確查看哪些 Git LFS 對象將被修剪:
$ git lfs prune --dry-run --verbose ✔ 4 local objects, 33 retained 4 files would be pruned (2.1 MB) * 4a3a36141cdcbe2a17f7bcf1a161d3394cf435ac386d1bff70bd4dad6cd96c48 (2.0 MB) * 67ad640e562b99219111ed8941cb56a275ef8d43e67a3dac0027b4acd5de4a3e (6.3 KB) * 6f506528dbf04a97e84d90cc45840f4a8100389f570b67ac206ba802c5cb798f (1.7 MB) * a1d7f7cdd6dba7307b2bac2bcfa0973244688361a48d2cebe3f3bc30babcf1ab (615.7 KB)
--verbose 模式輸出的長十六進制字符串是要修剪的 Git LFS 對象的 SHA-256 哈希(也稱為對象 ID 或 OID)。 你可以使用“查找路徑”中描述的技術或引用 Git LFS 對象的提交來查找有關將被修剪的對象的更多信息。
作為附加的安全檢查,你可以使用--verify-remote 選項在刪除之前,檢查遠程 Git LFS 存儲區是否具有你的 Git LFS 對象的副本:
$ git lfs prune --verify-remote ✔ 16 local objects, 2 retained, 12 verified with remote Pruning 14 files, (1.7 MB) ✔ Deleted 14 files
這將使修剪過程明顯變慢,但是你可以從服務器上恢復所有修剪的對象,從而使你高枕無憂。 你可以通過全局配置 lfs.pruneverifyremotealways 屬性為系統永久啟用--verify-remote 選項:
$ git config --global lfs.pruneverifyremotealways true
或者,你可以通過省略上述命令中的--global 選項,僅對當前倉庫啟用遠端校驗。
從服務器刪除遠端 Git LFS 文件
Git LFS 命令行客戶端不支持刪除服務器上的文件,因此如何刪除他們取決於你的托管服務提供商。
在 Bitbucket Cloud 中,你可以通過倉庫設置> Git LFS查看和刪除 Git LFS 文件:
請注意,每個 Git LFS 文件均通過其 SHA-256 OID 進行索引; 通過 UI 看不到引用每個文件的路徑。這是因為在許多不同的提交中,可能對應有許多引用對象的不同路徑,因此查找它們將是一個非常緩慢的過程。
要確定給定的 Git LFS 文件實際包含什么,你有三個選項可用:
- 在 Bitbucket Git LFS UI 的左欄中查看文件預覽圖像和文件類型
- 使用 Bitbucket Git LFS UI 右欄中的鏈接下載文件-搜索引用 Git LFS 對象的 SHA-256 OID 的提交,如下一節所述
查找引用 Git LFS 對象的路徑或提交
如果你有一個 Git LFS SHA-256 OID,你可以使用 git log --all -p -S 命令確定哪些提交引用了它:
$ git log --all -p -S 3b6124b8b01d601fa20b47f5be14e1be3ea7759838c1aac8f36df4859164e4cc commit 22a98faa153d08804a63a74a729d8846e6525cb0 Author: Tim Pettersen <tpettersen@atlassian.com> Date: Wed Jul 27 11:03:27 2016 +1000 Projectiles and exploding asteroids diff --git a/Assets/Sprites/projectiles-spritesheet.png new file mode 100755 index 0000000..49d7baf --- /dev/null +++ b/Assets/Sprites/projectiles-spritesheet.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3b6124b8b01d601fa20b47f5be14e1be3ea7759838c1aac8f36df4859164e4cc +size 21647
此 git log 咒語會通過添加或刪除包含指定字符串(Git LFS SHA-256 OID)的行(-S)的任何分支(--all)上的提交生成補丁(-p)。
該補丁將向你顯示 LFS 對象的提交和路徑,以及添加它的人和提交時間。 你可以簡單地檢出提交,Git LFS 將在需要時下載文件並將其放置在你的工作副本中。
如果你懷疑特定的 Git LFS 對象位於當前的 HEAD 或特定的分支中,則可以使用 git grep 查找引用它的文件路徑:
# find a particular object by OID in HEAD $ git grep 3b6124b8b01d601fa20b47f5be14e1be3ea7759838c1aac8f36df4859164e4cc HEAD HEAD:Assets/Sprites/projectiles-spritesheet.png:oid sha256:3b6124b8b01d601fa20b47f5be14e1be3ea7759838c1aac8f36df4859164e4cc # find a particular object by OID on the "power-ups" branch $ git grep e88868213a5dc8533fc9031f558f2c0dc34d6936f380ff4ed12c2685040098d4 power-ups power-ups:Assets/Sprites/shield2.png:oid sha256:e88868213a5dc8533fc9031f558f2c0dc34d6936f380ff4ed12c2685040098d4
你可以用任何包含 Git LFS 對象的 ref,commit 或 tree 替換 HEAD 或 power-ups。
包含/排除 Git LFS 文件
在某些情況下,你可能指向為特定提交下載可用的 Git LFS 內容的子集。例如,在配置 CI 構建以運行單元測試時,你可能只需要源代碼,因此可能要排除構建代碼不需要的重量級文件。
你可以使用git lfs fetch -X
(或--exclude
)排除模式或子目錄:
$ git lfs fetch -X "Assets/**"
或者,你可能只想包含特定的模式或子目錄。例如,音頻工程師可以使用git lfs fetch -I
(或 --include
)命令僅獲取 ogg 和 wav 文件:
$ git lfs fetch -I "*.ogg,*.wav"
如果你將包含和排除合並在一起使用,則只會獲取與包含模式匹配,但與排除模式不匹配的文件。例如,你可以使用以下方法獲取 Assets 目錄中除 gif 文件之外的所有內容:
$ git lfs fetch -I "Assets/**" -X "*.gif"
排除和包含支持與 git lfs track 和.gitignore 相同的模式。 你可以通過設置 lfs.fetchinclude 和 lfs.fetchexclude 配置屬性,使這些模式對於特定倉庫來說永久生效:
$ git config lfs.fetchinclude "Assets/**" $ git config lfs.fetchexclude "*.gif"
通過附加--global 選項,也可以將這些設置應用於系統上的每個倉庫。
鎖定 Git LFS 文件
不幸的是,沒有解決二進制合並沖突的簡便方法。 使用 Git LFS 文件鎖定,你可以按擴展名或文件名鎖定文件,並防止二進制文件在合並期間被覆蓋。
為了利用 LFS 的文件鎖定功能,你首先需要告訴 Git 哪些類型的文件是可鎖定的。 在下面的示例中,在 git lfs track 命令后附加了--lockable 標志,該命令既將 PSD 文件存儲在 LFS 中,又將它們標記為可鎖定。
$ git lfs track "*.psd" --lockable
然后將以下內容添加到.gitattributes 文件中:
*.psd filter=lfs diff=lfs merge=lfs -text lockable
在准備對 LFS 文件進行更改時,你將使用 lock 命令以便將文件在 Git 服務器上注冊為鎖定的文件。
$ git lfs lock images/foo.psd
Locked images/foo.psd
一旦不再需要文件鎖定,你可以使用 Git LFS 的 unlock 命令將其移除。
$ git lfs unlock images/foo.psd
與 git push 類似,可以使用--force 標志覆蓋 Git LFS 文件鎖。 除非你完全確定自己在做什么,否則不要使用--force 標志。
$ git lfs unlock images/foo.psd --force
Git LFS 如何工作
如果你想了解有關 clean 和 smudge filter,pre-push 鈎子以及 Git LFS 背后的其他有趣的計算機科學的更多信息,請查看來自 Atlassian 在 LinuxCon 2016 的 Git LFS 的演示文稿。
作者:terryshchen,騰訊 IEG 應用開發工程師
喜歡這篇文章?歡迎打賞~~