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

簡介

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 //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,如果你項目中有大文件,那麼就參考這篇文章吧。

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

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

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