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