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/
最通俗的解讀,最深刻的乾貨,最簡潔的教程,眾多你不知道的小技巧等你來發現!
歡迎關注我的公眾號:「程式那些事」,懂技術,更懂你!