原文鏈接: http://blog.csdn.net/xuyaqun/article/details/49275477
git目前唯一不能實現的是:不能像svn那樣,針對子目錄設置權限,這與git分布式倉庫的運行機制有關,svn是基於文件方式的集中存儲,Git卻是基於元數據方式分布式存儲文件信息的,它會在每一次Clone的時候將所有信息都取回到本地,即相當於在你的機器上生成一個克隆版的版本庫,既然本地有了完整的版本庫,肯定就有所有權限了,所以也就沒辦法針對子目錄的進行權限控制了。
只拉取一個repository中的幾個子目錄的代碼,而非整個庫,從上文的說明中也能看出這是不能實現的,對,在git 1.7.0 之前是不能實現的,git認為如果這樣做的話,倉庫的數據一致性無法保證,即使你真的這樣做,完全可以把這些不相關聯的子目錄放到不同的repository,repository之間是彼此獨立的。
如果非要只clone repository中的幾個子目錄的話,那就用sparse clone,git從1.7.0開始支持,sparse clone也只是一個變通的方法:先拿到整個repository的object等元數據信息,然后在本地加一個叫.git/info/sparse-checkout的文件(即黑名單、白名單,支持正則,參見下文具體操作命令)來控制pull那些目錄和文件(類似.gitignore文件,都是本地的概念),變通的實現。
git的實現:基於sparse clone變通方法
## step 1 :初始化空庫
[root@vm_test backup]# mkdir devops
[root@vm_test backup]# cd devops/
[root@vm_test devops]# git init #初始化空庫
## step 2 : 拉取remote的all objects信息
[root@vm_test devops]# git remote add -f origin http://laijingli@192.168.1.1:90/scm/beeper/yunxxx_ops.git #拉取remote的all objects信息
## step 3 : #3.1 開啟sparse clone, #3.2 設置需要pull的目錄 devlops
[root@vm_test devops]# git config core.sparsecheckout true #開啟sparse clone
[root@vm_test devops]# echo "devops" >> .git/info/sparse-checkout #設置需要pull的目錄,*表示所有,!表示匹配相反的
[root@vm_test devops]# more .git/info/sparse-checkout
## step 4 : # 將origin 端,由第三步(文件 .git/info/sparse-checkout)設置的 目錄下的文件 pull 到本地
[root@vm_test devops]# git pull origin master
## OK 啦!