在 Git 中如何只下载或只上传某个文件夹内容
在 Git 中如何只下载或只上传某个文件夹内容
需求来源
目前公司的插件及补丁对应的 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 功能,全取整个项目库,可以写一个”“号,但如果有排除项,必须写”/“,同时排除项要写在通配符后面。