git-lfs 指南


什么是 git-lfs

Github 對文件大小的限制

如果你在命令行用 git push > 50 MB 的文件,你會收到一個 warning,但是你仍然可以正常 push,但是 > 100 MB 的時候就無法 push

如果你在瀏覽器要上傳文件的話,限制更為嚴重,不能超過 25 MB

另外有幾點值得注意:

  1. Github 建議倉庫的大小理想情況下不要超過 1 GB,最好不要超過 5 GB
  2. Github 從來不建議把倉庫當成一種備份工具

為什么需要 gif-lfs

前面提到的 Github 對文件大小的限制是一點

另外因為每次我們在使用 git commit 的時候,其實是給當前的倉庫創建了一次快照,本質是全倉庫的克隆,如果大文件太多是很不好的,你的 Git 倉庫會越來越大

什么情況下不需要用 gif-lfs

  1. 文件沒有超過限制當然就沒有必要用了
  2. 如果是要分發二進制文件(比如 *.exe)等,此時直接用 Github 提供的 release 功能就好了

git-lfs 原理

使用 gif-lfs 之后,在倉庫中存儲的其實是對大文件的引用,可以理解為指針。而真正的大文件托管在 Git Lfs 的服務器上

Github 給不同用戶的 git-lfs 提供的額度不一樣,免費用戶和 Pro 用戶都是 2 GB

引用文件長什么樣子

比如官方文檔里面提到的例子:

version https://git-lfs.github.com/spec/v1
oid sha256:4cac19622fc3ada9c0fdeadb33f88f367b541f38b89102a3f1261ac81fd5bcb5
size 84977953

其中 version 是你正在使用的 git-lfs 的版本,oid 是標志符(id),size 是文件的真實大小

開始使用 git-lfs

如何安裝 git-lfs (Mac 環境下)

> brew install git-lfs
> git lfa install                 # 如果輸出為 Git LFS initialized. 就是正常安裝好了

Case 1. 從 0 開始配置使用 git-lfs

我們要指定 git-lfs 會把哪些文件當作大文件,指定方式比如有:

  1. 指定文件后綴名——git lfs track "*.filetype"
  2. 指定某個目錄下的所有文件——git lfs track "directory/*"
  3. 具體指定某個文件——git lfs track "path/to/file"
> mkdir <repo>
> cd <repo>
> git init
> git lfs track "*.filetype"			# 比如 *.zip

# 其實 git lfs track 會修改 .gitattributes 文件的內容,可以做一個快速的驗證
# > cat .gitattributes
# *.zip filter=lfs diff=lfs merge=lfs -text

# 下面假定在 Github 有一個遠程倉庫供我們使用
# 往倉庫里加你先前指定的文件類型的大文件
> git add . 											
> git commit -m ""
> git branch -M main
> git remote add origin git@github.com:<username>/<remote_repo_name>.git		# 這里替換為自己的用戶名和遠程倉庫名
> git push -u origin main
# 此時命令行會顯示
# > uploading LFS objects
# 如果沒有采用 git-lfs,則顯示如下內容
# > Enumerating objects: 3, done.
#   Counting objects: 100% (3/3), done.
#   Delta compression using up to 8 threads
#   Compressing objects: 100% (2/2), done.

Case 2. 要在已有的倉庫上用 git-lfs 追蹤某些文件

此時只是簡單的使用 git lfs track "" 是沒用的,因為你之前的 commit 已經生成了快照,你無法追蹤歷史中的這些大文件。

git-lfs 只會在你開始設置的此刻之后追蹤新生成的指定文件

可以快速做個驗證,假設我們還在這個倉庫里⬇️

> ls > test1.txt
> ls -l > test2.txt
> git add test1.txt test2.txt
> git commit -m "Add txt files"

# 假設我們現在要把 txt 文件當成是大文件,我們可能會想這么做
> git lfs track "*.txt"
> git add .gitattributes
> git commit -m "Track *.txt files"
> git lfs ls-files                      # 此時你會發現 git-lfs 並沒有追蹤 txt 文件

> echo "hello" > test3.txt
> git add test3.txt
> git commit -m "Add test3.txt"
> git lfs ls-files                      # 此時你可以在輸出中看到 test3.txt

正確的方法是使用 git lfs migrate,這里只列舉了簡單的用法,更復雜的可以看看手冊。比如可以用 --include-ref= 指定分支,多個分支的時候最好一個分支一個分支地遷移,最后是 git push --all -f

> git lfs migrate import --include="*.txt"  # 在當前分支上執行
> git lfs ls-files                          # 此時可以發現 text1.txt 和 text2.txt 也被追蹤到了
> git push --force                          # 讓遠程倉庫也改過來

Case 3. 不再跟蹤某些文件

> git lfs untrack "*.filetype"
> git rm --cached "*.txt"

其他常用命令

  1. 查看當前 git-lfs 正在追蹤的文件類型——git lfs track
  2. 查看當前 git-lfs 正在追蹤哪些文件——git lfs ls-file

參考

  1. https://docs.github.com/en/repositories/working-with-files/managing-large-files/about-large-files-on-github


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM