? ? 最近新公司學習相應的代碼邏輯,使用SVN作為項目的托管工具,實屬不大習慣,尤其對于用慣了git的人來說。一度想嘗試使用git-svn的組合拳的方式,間接通過git來實現git才有的本地倉庫。反正最終沒落實,也就這樣,去熟悉SVN的那一套邏輯,其實也還OK,接受范圍之內。
? ? 不過,今天有個同事來問我git是否可以像SVN那樣單獨拉下倉庫里的某個文件夾或者某些文件呢,畢竟整個項目結構這么龐大,不一定每個項目文件都是需要的,只需要拉下開發需求的文件就行。自認為git知識還是相當熟透的我,覺得問題應該不大,但是實操卻發現,這有點難受,好像git并沒有留下對應的命令操作方式。如果使用SVN還比較簡單點,大體實現如下:
# 先checkout空目錄
svn co--depthempty svnLocation localDir
# 對需要的子目錄遞歸checkout
svn update--set-depthinfinity localDir/data
svn update--set-depthinfinity localDir/block
? 后來谷歌研究了下實現方法,原來還是有方式可以去實現的,我就覺得嘛,萬能的git哪有實現不了的東西。于是我嘗試進行了這么些操作,只能說感謝先人。
? 因為SVN是基于文件方式存儲的,而git是基于元數據方式分別式存儲文件信息的,注定每次clone的時候都會將所有信息都取回至本地,并在本地生成一個克隆版的版本庫。但是發現在Git 1.7.0之后,新加入了Sparse checkout模式,可以實現指定checkout指定文件或者文件夾到本地。具體實現我們可以嘗試下:
? 1. 創建一個文件夾checkout_part_from_git
? 2. 打開git bash,進入文件夾對應路徑,執行git init初始化倉庫
? 3. git remote add -f origin <url> 將遠程URL加入到git config中
?4. git config core.sparsecheckout true 允許config中使用Sparse checkout模式
5. 需要指定checkout哪個文件夾或者哪個文件
? ? echo "game/region" >> .git/info/sparse-checkout
6. 最后將遠程分支上的項目拉下來: git pull origin master
大功告成!
過程展示如下: