Git的稀疏檢出功能

Git的稀疏檢出功能

稀疏檢出定義:

所謂稀疏檢出就是:Git本地庫檢出時不檢出所有,只將指定的文件從Git本地庫檢出到Git工做區,而其餘未指定的文件則不予檢查(即便這些文件存在於工做區,其修改也會被忽略)。 git

稀疏檢出設置:

想要實現稀疏檢出的功能,必須設置core.sparseCheckout配置變量,並存在文件.git/info/spare-checkout。即首先要設置Git配置變量core.sparseCheckouttrue,而後編輯.git/info/spare-checkout文件,將要檢出的目錄或文件的路徑寫入其中。其中文件.git/info/sparse-checkout的格式和.gitignore文件格式同樣,路徑可使用通配符。 數據庫

稀疏檢出如何實現?

實際上Gitindex(Git暫存區)中爲每一個文件提供一個名爲skip-worktree的標誌位,默認這個標誌位處於關閉狀態。若是開啓該標誌位,則不管Git工做區對應的文件存在是否,或者是否被修改,Git都認爲Git工做區該文件的版本是最新的、無變化的。Git經過配置文件.git/info/spare-checkout定義一個要檢查的目錄和或文件列表,當前Git的基於合併(git mergegit checkout)等命令可以根據該配置文件更新的index中文件的skip-worktree表示位,實現Git本地庫文件的稀疏檢出。 vim

體驗Git的稀疏檢出功能(命令行操做)

1.克隆建立Git本地庫

首先在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.

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版本庫中包含三個目錄doc1doc2doc3和一個文件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命令去查看,會發現工做區的READMEdoc2目錄下的文件被設置了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

相關文章
相關標籤/搜索