公司的開發(fā)從SVN切換到Git,在SVN下,可以很方便的只獲取版本庫中一個(gè)或多個(gè)目錄的內(nèi)容,但是Git的克隆,默認(rèn)是直接拉取整個(gè)遠(yuǎn)程倉庫,如果項(xiàng)目比較大,大量和自己無關(guān)的內(nèi)容也會拉到本地,占用很多硬盤空間。
在網(wǎng)上搜了一下,Git在1.7版本后,已經(jīng)支持只Checkout部分內(nèi)容,這個(gè)功能叫做 sparse checkout(稀疏檢出)。
開啟
git config core.sparsecheckout true
寫入要獲取的文件
echo "BATInterview" >> .git/info/sparse-checkout
只拉取BATInterview文件夾
此時(shí)會在sparse-checkout文件中追加
如果以后修改了 .git/info/sparse-checkout,增加或刪除部分目錄,可以執(zhí)行如下命令重新Checkout
$ git checkout master
或執(zhí)行以下命令:
$ git read-tree -mu HEAD
要關(guān)閉 sparse checkout功 能,
僅僅修改設(shè)置,將core.sparsecheckout設(shè)為false是不生效的,需要修改 .git/info/sparse-checkout 文件,用一個(gè)”*“號替代其中的內(nèi)容,然后執(zhí)行 checkout 或 read-tree 命令。
(淺克隆)
如果只拉取最近一次的變更,忽略以前的變更記錄,在拉取時(shí)可以加參數(shù)depth,如git pull --depth=1 origin master
已經(jīng)建了版本庫
如果本地已經(jīng)建了版本庫,要使用這個(gè)功能,可以進(jìn)入版本庫的目錄,執(zhí)行以下命令
$ git config core.sparsecheckout true
$ echo "path1/" >> .git/info/sparse-checkout
$ echo "path2/" >> .git/info/sparse-checkout
$ git checkout master
sparse-checkout 文件設(shè)置
子目錄的匹配在 sparse-checkout 文件中,如果目錄名稱前帶斜杠,如/docs/
,將只匹配項(xiàng)目根目錄下的docs目錄,如果目錄名稱前不帶斜杠,如docs/
,其他目錄下如果也有這個(gè)名稱的目錄,如test/docs/
也能被匹配。而如果寫了多級目錄,如docs/05/
,則不管前面是否帶有斜杠,都只匹配項(xiàng)目根目錄下的目錄,如test/docs/05/
不能被匹配。
通配符 ““ (星號)在 sparse-checkout 文件中,支持通配符 ““,如可以寫成以下格式:
*docs
/index.*
*.gif
排除項(xiàng)
“!” (感嘆號)在 sparse-checkout 文件中,也支持排除項(xiàng) “!”,如只想排除排除項(xiàng)目下的 “docs” 目錄,可以按如下格式寫:
/*
!/docs/
很像 .gitignore的寫法
要注意一點(diǎn):如果要關(guān)閉sparsecheckout功能,全取整個(gè)項(xiàng)目庫,可以寫一個(gè)”“號,但如果有排除項(xiàng),必須寫”/“,同時(shí)排除項(xiàng)要寫在通配符后面。
參考:https://zhgcao.github.io/2016/05/11/git-sparse-checkout/
實(shí)測時(shí)發(fā)現(xiàn),不在sparse-checkout的文件,pull 是不會拉取了,但是添加還是會默認(rèn)添加的