Github又悄悄升級了,這次的變化是大檔案的儲存方式

flydean發表於2022-03-18

簡介

github是大家常用的程式碼管理工具,也被戲稱為世界上最大的程式設計師交友網站,它的每次升級都會影響很多使用者。在我的個人github網站上,之前在做JAVA NIO demo的時候上傳了一個自制的大檔案,最近對這個專案進行了一些修改,但是卻上傳不上github網站了,檢視報錯的原因,就是說專案中有一個大檔案無法上傳,現在github提供了一個叫做Git Large File Storage (LFS)的工具來替換github中的大檔案。

那麼什麼是LFS,我們應該怎麼使用LFS呢?一起來看看吧。

LFS和它的安裝

LFS的全稱是Git Large File Storage,可以將庫中的大檔案儲存在遠端伺服器比如GitHub.com或者GitHub Enterprise上,在庫中儲存的是指向這些大檔案的連結。

LFS安裝起來比較簡單,在mac上可以使用下面的brew命令:

brew install git-lfs

安裝完畢之後,需要把LFS和你的git賬號關聯起來:

git lfs install
注意lfs需要git版本>= 1.8.2

接下來我們就可以愉快的使用LFS了。

LFS的使用

為了模擬github上的大檔案,我們可以在github上建立一個新的repository,然後執行下面的命令新增對應的內容:

git init .
echo Hello World > README.md
git add README.md
git commit -m "Initial commit"

上面的程式碼提交到github上肯定沒有問題。

為了測試大檔案,我們可以使用dd命令建立一個256M的大檔案如下:

dd if=/dev/urandom of=test.bin bs=1024 count=262144

在最新版本的github中,這個檔案肯定是上傳不上去的,那麼我們應該怎麼使用LFS呢?

lfs提供了下面的help命令:

$ git lfs help <command>
$ git lfs <command> -h

這裡我們需要使用的是git lfs track命令如下:

git lfs track '*.bin'

上面的例子我們使用的是萬用字元來匹配所有以bin結尾的檔案。

當然,如果你想匹配上面的test.bin檔案,也可以直接這樣使用:

git lfs track 'test.bin'

這個命令的目的就是使用lfs來跟蹤這些bin檔案。你也可以使用track命令來列出所有被lfs的跟蹤路徑:

git lfs track

Listing tracked paths
    *.bin (.gitattributes)

我們可以使用下面的命令來檢視lsf具體的跟蹤檔案:

git lfs ls-files

但是因為你還沒有commit上面建立的bin檔案,所以這裡是看不到的。

這些lfs的trace資訊是儲存在專案根目錄下的.gitattributes中的。

我們需要一併提交這個.gitattributes檔案,以便所有checkout這個庫的使用者都可以知曉這個lfs服務。

當我們把所有的檔案都提交之後,再使用git lfs ls-files命令,可以看到類似下面的內容:

d05241dd24b * test.bin

說明這個檔案已經新增到了lfs中。

從LFS中刪除檔案

上面我們講解了如何將檔案新增到LFS中進行跟蹤,如果我們不想使用LFS而是使用傳統的git來管理檔案該怎麼辦呢?

lfs提供了untrack的命令,它是和track相反的命令如下:

git lfs untrack "*file-type"

在untrack之後,還要記得從git cache中刪除這個檔案:

git rm --cached "*file-type"

然後重新新增這個檔案到git,commit然後提交即可:

git add "*file-type"
git commit -m "restore "*file-type" to git from lfs"

從LFS中拉取程式碼

從LFS中拉取程式碼和傳統的普通的git拉取程式碼是一致的,直接使用git clone命令即可:

git clone https://github.com/username/test_repo.git destination_dir

轉換歷史資料到LFS

有時候我們的檔案已經在repository中了,比如很多歷史提交的檔案,我們想要將其轉換稱為LFS儲存該怎麼辦呢?

lfs提供了一個migrate命令,用來進行檔案的轉存。

git lfs migrate

要想使用migrate命令,需要安裝 Git LFS v2.2.1版本以上。

比如我們想要migrate所有的bin檔案,可以這樣寫:

git lfs migrate import --include="*.bin"

上面的命令只針對的是本地的branch,如果要migrate遠端的branch,可以新增一個--include-ref引數,如下所示:

git lfs migrate import --include="*.bin" --include-ref=refs/heads/master 

然後強制提交庫即可:

git push --force

最後,上面的命令雖然將歷史的git objects 轉換成了 lfs objects,但是本地的.git檔案中並沒有變化,所以還需要執行下面的命令對.git資料夾進行清理:

git reflog expire --expire-unreachable=now --all
git gc --prune=now

總結

如果你沒有使用大檔案,那麼你不會用到lfs,如果你專案中有大檔案,那麼就參考這篇文章吧。

本文已收錄於 http://www.flydean.com/07-git-largefile/

最通俗的解讀,最深刻的乾貨,最簡潔的教程,眾多你不知道的小技巧等你來發現!

歡迎關注我的公眾號:「程式那些事」,懂技術,更懂你!

相關文章