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 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/

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

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


免責聲明!

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



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