GitHub拉取文件夹下的某个具体文件/文件夹

  • 需求

    GitHub上项目大了之后,某次只需要某个文件或文件夹,并不需要全部拉取。

  • 前导知识

    查阅资料,有两个关键字:

    • git checkout [branch] – [file name]
    • svn
  • git checkout

    # 1.初始化
    mkdir localdir # 创建用于作为本地仓库的文件夹
    cd localdir # 进入文件夹
    git init # 在本地指定文件夹内执行此命令设置为git仓库
    # 2. 拉取remote all objects信息
    git remote add -f origin http://github/projectName.git # 添加远程仓库地址,实现拉取remote的all objects信息
    # 3. 开启sparse clone
    git config core.sparsecheckout true # 用于控制是否允许设置pull指定文件/夹,适用于Git1.7.0以后版本,本质是开启sparse clone
    echo "fileName" >> .git/info/sparse-checkout # 本地目录的.git文件夹下,如果没有sparse-checkout文件则创建,在其中添加指定的文件/夹fileName,就是需要拉取的那个特定文件/夹。*表示所有,!表示匹配相反
    cat .git/info/sparse-chechout # 查看
    # 4. 拉取指定目录
    git pull origin master # 拉取命令是一样的,只是已经通过配置文件sparse-chechout指定了目标文件/夹
    
  • svn

    GitHub repositories can be accessed from both Git and Subversion(SVN) clients.

    svn co --depth empty https://github.com/user/repo # make an empty checkout fo the repository
    svn up trunk # get the trunck branch,The Subversion bridge maps trunk to the Git HEAD branch(which is usually master)
    svn co https://github.com/user/repo/trunk/fileName # 拉取指定目录
    
  • git与svn不同

    git不能向svn那样针对子目录设置权限。

    svn是基于文件方式的几种存储,git是基于元数据方式分布式存储文件信息。

    Git会在每一次Clone的时候将所有信息都拉回本地,相当于在本地生成一个克隆版的版本库,因此就有了所有权限,也就没法针对子目录进行权限控制了。

    因此本质上来讲,Git是不支持只拉取一个仓库中的部分数据的,但是Git1.7.0之后可以通过sparse clone来变通。

  • sparse clone

    sparse clone的逻辑是:

    1. 在本地先从remote拿到repository的all objects的元数据信息;
    2. 在本地仓库添加.git/info/sparse-chechout的文件(类似白名单)来配置需要pull的目录及文件;
    3. git pull master origin
  • Reference

  1. ZZ:git只clone仓库中指定子目录和指定文件的实现
  2. SVN : GitHub Support for Subversion clients
  3. GitHub 拉取指定子目录

你可能感兴趣的:(#,Linux,GitHub,指定文件,svn,git,checkout)