Git

git克隆指定的文件和目录

git的sparse checkout模式

Posted by LZP on August 9, 2018

在进行项目开发的时候,有时候会有这样的需求那就是:我们只希望从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==

注意:本质上是写文件名和目录名到 .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.