在进行项目开发的时候,有时候会有这样的需求那就是:我们只希望从Git仓库里取指定的文件或者文件夹出来。在SVN里面,这非常容易实现,因为SVN基于文件方式存储,而Git却是基于元数据方式分布式存储文件信息的,它会在每一次Clone的时候将所有信息都取回到本地,即相当于在你的机器上生成一个克隆版的版本库。
因此在Git1.7.0以前,这无法实现,但是幸运的是在Git1.7.0以后加入了Sparse Checkout模式,这使得Check Out指定文件或者文件夹成为可能。
第一种方法
第一步:建立本地仓库和远程仓库的关联
进入准备建立本地仓库的父目录,执行如下命令:
==git clone –n <远程仓库> <准备新建的本地目录名称>==准备新建的本地目录名称>远程仓库>
注意:使用了-n 参数,只初始化本地仓库,并建立和远程仓库的关联,不checkout远程仓库
然后,进入新的本地目录,执行如下命令 ==cd <前一步新建的本地目录名称>==前一步新建的本地目录名称>
第二步:指定要checkout哪些文件和子目录
设定sparse checkout模式 ==git config core.sparsecheckout true==
设定要checkout的文件和目录,下面这个命令可写多条 ==echo <要checkout的文件名> >> .git/info/sparse-checkout== ==echo <要checkout的目录名> >> .git/info/sparse-checkout==要checkout的目录名>要checkout的文件名>
注意:本质上是写文件名和目录名到 .git/info/目录下的sparse-checkout文件中,每一个就是一行
第三步:从指定的仓库分支中checkout前面指定的文件和目录
==git checkout <分支名称>==分支名称>
之后,就可以在本地编辑处理,然后按常规方式去add、commit、push
第二种方法
第一步:初始化一个本地仓库
==git init <要新建的本地目录名称>>== ==cd <前面新建的本地目录名称>==前面新建的本地目录名称>要新建的本地目录名称>
第二步:指定远程仓库
==git remote add -f origin <远程仓库>==远程仓库>
第三步:指定克隆模式: 稀疏克隆模式
==git config core.sparsecheckout true==
第四步:指定克隆的文件夹(或者文件)
==echo “要克隆的文件夹名(或者文件名)” » .git/info/sparse-checkout==
第五步:拉取远程文件
==git pull origin master==
一个完整的例子
git init mypathname
cd mypathname
git remote add -f origin https://github.com/bestswifter/MySampleCode.git
git config core.sparsecheckout true
echo "CornerRadius" >> .git/info/sparse-checkout
git pull origin master
常见错误
错误信息:“error: Sparse checkout leaves no entry on the working directory”
解决方法:using a git-bash prompt NOT powershell/CMD
原因: This is because otherwise the echo command produces a UNICODE file with a BOM marker. The file MUST be an ANSI formatted file with UNIX style line endings for git to parse it correctly.