在 Git 中如何只下载或只上传某个文件夹内容

在 Git 中如何只下载或只上传某个文件夹内容

需求来源

目前公司的插件及补丁对应的 git 的一个大的项目

git://61.183.71.118/plugin/plugins.git

是一个插件的集合项目,

这样设计的目的之一是:插件扫描工具有一个固定的 git 仓库地址上传;

Git 的克隆,默认是直接拉取整个远程仓库,如果项目比较大,大量和自己无关的内容也会拉到本地,占用很多硬盘空间。

Git 在 1.7 版本后,已经支持只 Checkout 部分内容,这个功能叫做 sparse checkout(稀疏检出)。

例子中 plugins 有 2 个插件 x1,x2,分别在 2 个目录中,

以下操作以此示例为基础,

Git 操作

从 1.7.0 版本开始 git 提供稀疏检出的功能。所谓稀疏检出就是本地版本库检出时不检出全部,只将指定的文件从本地版本库检出到工作区,而其他未指定的文件则不予检出(即使这些文件存在于工作区,其修改也会被忽略)

下载

git init test && cd test     // 新建仓库并进入文件夹

git config core.sparsecheckout true // 设置允许克隆子目录

echo 'x1' >> .git/info/sparse-checkout // 设置要克隆的仓库的子目录路径   //空格别漏

git remote add origin http://61.183.71.118:8188/r/plugin/plugins.git //添加远程库的地址

git pull origin master  // 下载代码

上传

git init

git remote add origin http://61.183.71.118:8188/r/plugin/plugins.git

git config core.sparsecheckout true

echo 'x2' >> .git/info/sparse-checkout // 

git config --global user.name "plugin" 

git config --global user.email "plugin@epichust.com"

git pull origin master

git add .

git commit -m "插件初始化提交"

git push  origin master

附:

sparse-checkout 文件设置

子目录的匹配
在 sparse-checkout 文件中,如果目录名称前带斜杠,如/docs/,将只匹配项目根目录下的 docs 目录,如果目录名称前不带斜杠,如docs/,其他目录下如果也有这个名称的目录,如test/docs/也能被匹配。
而如果写了多级目录,如docs/05/,则不管前面是否带有斜杠,都只匹配项目根目录下的目录,如test/docs/05/不能被匹配。

通配符 ““ (星号)
在 sparse-checkout 文件中,支持通配符 “
“,如可以写成以下格式:

*docs/
index.*
*.gif

排除项 “!” (感叹号)
在 sparse-checkout 文件中,也支持排除项 “!”,如只想排除排除项目下的 “docs” 目录,可以按如下格式写:

/*
!/docs/

要注意一点:如果要关闭 sparsecheckout 功能,全取整个项目库,可以写一个”“号,但如果有排除项,必须写”/“,同时排除项要写在通配符后面。