Git的稀疏检出功能

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本地库文件的稀疏检出。

体验Git的稀疏检出功能(命令行操作)

1.克隆创建Git本地库

首先在worksparce1工作区中通过克隆的方法创建一个Git本地库sparse-checkout

命令:git clone git@gitlab.szreach.com:fengyang/sparse-checkout.git

root@fengyangvm:~/workspace1# git clone git@gitlab.szreach.com:fengyang/sparse-checkout.git

Cloning into 'sparse-checkout'...

remote: Counting objects: 17, done.

remote: Compressing objects: 100% (7/7), done.

remote: Total 17 (delta 2), reused 0 (delta 0)

Receiving objects: 100% (17/17), done.

Resolving deltas: 100% (2/2), done.

2.查看sparse-checkout Git本地库包含的内容

创建好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的标志位已开启。

3.修改Git版本库的配置变量core.sparseCheckout,将其设置为true

命令: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

4.设置.git/info/sparse-checkout的内容

设置.git/info/sparse-checkout的内容,如下:

命令:vim .git/info/sparse-checkout

      doc1

      doc3

查看:cat .git/info/spares-checkout

doc1

doc3

5.执行git checkout命令

当执行git checkout命令后,查看会发现doc2目录不见了。

命令:git checkout

命令:ls -F

doc1/  doc3/

6.用git ls-files -v命令去查看

这是如果用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

7.文件.git/info/sparse-checkout也支持用星号(*)和感叹号(!)操作

修改.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

8.修改不检出目录下的文件或着在不检出目录下添加新文件,Git会视而不见

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)

9.可以从Git远程数据库拉取其他用户推送的doc2历史记录

在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(-)

10.更改doc2目录下文件的skip-worktree标志为检出

更改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

转载于:https://my.oschina.net/u/183217/blog/185289

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值