所谓稀疏检出就是:Git本地库检出时不检出所有,只将指定的文件从Git本地库检出到Git工做区,而其余未指定的文件则不予检查(即便这些文件存在于工做区,其修改也会被忽略)。 git
想要实现稀疏检出的功能,必须设置core.sparseCheckout配置变量,并存在文件.git/info/spare-checkout。即首先要设置Git配置变量core.sparseCheckout为true,而后编辑.git/info/spare-checkout文件,将要检出的目录或文件的路径写入其中。其中文件.git/info/sparse-checkout的格式和.gitignore文件格式同样,路径可使用通配符。 数据库
实际上Git在index(即Git暂存区)中为每一个文件提供一个名为skip-worktree的标志位,默认这个标志位处于关闭状态。若是开启该标志位,则不管Git工做区对应的文件存在是否,或者是否被修改,Git都认为Git工做区该文件的版本是最新的、无变化的。Git经过配置文件.git/info/spare-checkout定义一个要检查的目录和或文件列表,当前Git的基于合并(git merge、git checkout)等命令可以根据该配置文件更新的index中文件的skip-worktree表示位,实现Git本地库文件的稀疏检出。 vim
首先在worksparce1工做区中经过克隆的方法建立一个Git本地库sparse-checkout gitlab
命令:git clone git@gitlab.szreach.com:fengyang/sparse-checkout.git fetch
root@fengyangvm:~/workspace1# git clone git@gitlab.szreach.com:fengyang/sparse-checkout.git url Cloning into 'sparse-checkout'... spa remote: Counting objects: 17, done. 命令行 remote: Compressing objects: 100% (7/7), done. 3d remote: Total 17 (delta 2), reused 0 (delta 0) orm Receiving objects: 100% (17/17), done. Resolving deltas: 100% (2/2), done. |
建立好sparse-checkoutGit本地库后查看包含以下内容:
命令:ls -F
doc1/ doc2/ doc3/ README |
命令:git ls-files -s -v
H 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0 README H 100644 9d607966b721abde8931ddd052181fae905db503 0 doc1/readme.txt H 100644 8fdd954df9831dfd29ceec0d74829b02f3f5d8c3 0 doc2/readme.txt H 100644 dc7b54ad014355b948b93c4c6c5891da053d5fdd 0 doc3/readme.txt |
即sparse-checkout版本库中包含三个目录doc1、doc2、doc3和一个文件README。命令git ls-files的-s参数用来显示对象的SHA1哈希值及所处暂存区的编号。而-v参数则显示工做区文件的状态,每一行命令输出的第一个字符便是文件状态:字母H表示文件已被暂存,若是是字母S则表示该文件skip-worktree的标志位已开启。
命令:git config core.sparsecheckout true
设置完成后,用命令查看:git config -l
user.name=冯阳 user.email=fengyang@rd.szreach.com core.repositoryformatversion=0 core.filemode=true core.bare=false core.logallrefupdates=true core.sparsecheckout=true remote.origin.fetch=+refs/heads/*:refs/remotes/origin/* remote.origin.url=git@gitlab.szreach.com:fengyang/sparse-checkout.git branch.master.remote=origin branch.master.merge=refs/heads/master |
设置.git/info/sparse-checkout的内容,以下:
命令:vim .git/info/sparse-checkout
doc1
doc3
查看:cat .git/info/spares-checkout
doc1 doc3 |
当执行git checkout命令后,查看会发现doc2目录不见了。
命令:git checkout
命令:ls -F
doc1/ doc3/ |
这是若是用git ls-files -v命令去查看,会发现工做区的README和doc2目录下的文件被设置了skip-worktree标志。
命令:git ls-files -v
S README H doc1/readme.txt S doc2/readme.txt H doc3/readme.txt |
修改.git/info/sparse-checkout的内容,使之包含一个星号,便可在工做区检出全部内容
命令:vim .git/info/sparse-checkout
*
查看:cat .git/info/spares-checkout
* |
执行git checkout,会发现全部的目录又都回来了。
命令:git checkout
命令:ls -F
doc1/ doc2/ doc3/ README |
‚修改.git/info/sparse-checkout的内容,使之不检查目录doc2下的文件,而检查其余文件,可使用下面语法(注意顺序不能写反)
命令:vim .git/info/sparse-checkout
*
!doc2/*
执行git checkout查看效果
命令:git checkout
命令:ls -F
doc1/ doc3/ README |
注意:若是在这使用命令git checkout -- <file>... ,既不是切换分支而是用分支中的文件替换暂存区和工做区,则忽略skip-worktree标志。例如在上面的设置中,虽然doc2被设置为不检出,可是执行git checkout .命令后,全部的目录仍是都被检出。
命令:git checkout .
命令:git ls-files -v
H README H doc1/readme.txt S doc2/readme.txt H doc3/readme.txt |
doc2目录是设置为不检出的,如今在修改doc2目录下的文件,用命令git status查看,git会视而不见,查看不到任何状态。
命令:vim doc/readme.txt
hello
命令:git status
root@fengyangvm:~/workspace1/sparse-checkout# git status # On branch master nothing to commit (working directory clean) |
在workspace2工做区克隆sparse-checkout版本库,再修改doc2目录下的文件,或者在doc2目录下添加新文件,而且提交到Git本地库以及推送到Git远程库。
workspace1工做区中sparse-checkout版本库拉取最新的修改历史记录
命令:git pull origin
root@fengyangvm:~/workspace1/sparse-checkout# git pull origin remote: Counting objects: 7, done. remote: Compressing objects: 100% (2/2), done. remote: Total 4 (delta 1), reused 0 (delta 0) Unpacking objects: 100% (4/4), done. From gitlab.szreach.com:fengyang/sparse-checkout 7ee66a3..141ec35 master -> origin/master Updating 7ee66a3..141ec35 Fast-forward doc2/readme.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) |
更改doc2目录下文件的skip-worktree标志为检出的,经过取消core.sparsecheckout配置变量的设置而关闭稀疏检查不行的。这种状况经过git updat-index --no-skip-worktree -- <file>...来更改index中对应文件的skip-worktree标志,或者须要从新启用稀疏检出更改相应文件的检出状态,或者从新克隆份。
命令:git update-index --no-skip-worktree doc2/*
命令:git ls-files -v
root@fengyangvm:~/workspace1/sparse-checkout# git update-index --no-skip-worktree doc2/* root@fengyangvm:~/workspace1/sparse-checkout# git ls-files -v H README H doc1/readme.txt H doc2/readme.txt H doc3/readme.txt |