一、簡介
從 1.7.0 開始,Git 引入 sparse checkout(稀疏檢出) 機制,稀疏檢出機制允許只檢出指定目錄或者文件,這在大型 Git 倉庫中,將大幅度縮短 Git 執行命令的時間。
二、遠程倉庫
以下是我的遠程倉庫目錄:
nosee@DESKTOP-FNAF3T1 MINGW64 /g/NoSee/git (master)
$ ls -R
.:
index.html static/ admin/
./static:
test1.txt test2.txt test3.txt
.admin:
test4.txt test5.txt
需求:現在我需要檢出的是目錄static以及文件index.html。
三、配置稀疏檢出
要完成上面的需求,則需要通過以下配置來實現:
1、 首先新建一個目錄,再初始化一個 Git 倉庫,以便用稀疏檢出。
nosee@DESKTOP-FNAF3T1 MINGW64 /g/NoSee
mkdir git_web
nosee@DESKTOP-FNAF3T1 MINGW64 /g/NoSee/
cd git_web
nosee@DESKTOP-FNAF3T1 MINGW64 /g/NoSee/git_web
$ git init
Initialized empty Git repository in G:/NoSee/git_web/.git/
2、指定檢出目錄或文件
nosee@DESKTOP-FNAF3T1 MINGW64 /g/NoSee/git_web (master)
$ git config core.sparseCheckout true
nosee@DESKTOP-FNAF3T1 MINGW64 /g/NoSee/git_web (master)
$ echo /static/* >> .git/info/sparse-checkout
nosee@DESKTOP-FNAF3T1 MINGW64 /g/NoSee/git_web (master)
$ echo /index.html >> .git/info/sparse-checkout
nosee@DESKTOP-FNAF3T1 MINGW64 /g/NoSee/git_web (master)
$ cat .git/info/sparse-checkout
/static/*
/index.html
nosee@DESKTOP-FNAF3T1 MINGW64 /g/NoSee/git_web (master)
$ git config --list
core.symlinks=false
core.autocrlf=true
core.fscache=true
color.diff=auto
color.status=auto
color.branch=auto
color.interactive=true
help.format=html
rebase.autosquash=true
http.sslbackend=openssl
http.sslcainfo=C:/Program Files/Git/mingw64/ssl/certs/ca-bundle.crt
credential.helper=manager
[email protected]
user.name=Chan
core.repositoryformatversion=0
core.filemode=false
core.bare=false
core.logallrefupdates=true
core.symlinks=false
core.ignorecase=true
core.sparsecheckout=true # 看到這一項說明稀疏檢出配置成功
四、檢出
從遠程倉庫地址檢出指定目錄和文件:
nosee@DESKTOP-FNAF3T1 MINGW64 /g/NoSee/git_web (master)
$ git remote -v
nosee@DESKTOP-FNAF3T1 MINGW64 /g/NoSee/git_web (master)
$ git remote add origin git@*.*.*.*:/home/git.git #這裏是實際的遠程倉庫地址
nosee@DESKTOP-FNAF3T1 MINGW64 /g/NoSee/git_web (master)
$ git pull origin master
remote: Counting objects: 7, done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 7(delta 1), reused 5(delta 0)
Receiving objects: 100% (7/7), 1.00 MiB | 38.00 KiB/s, done.
Resolving deltas: 100% (7/7), done.
From *.*.*.*:/home/git
* branch master -> FETCH_HEAD
* [new branch] master -> origin/master
Checking out files: 100% (7/7), done.
nosee@DESKTOP-FNAF3T1 MINGW64 /g/NoSee/git_web (master)
$ ls -R
.:
index.html static/
./static:
test1.txt test2.txt test3.txt
如果還需要再檢出其它的目錄或文件,則需要將其加入到 .git/info/sparse-checkout 文件中。具體步驟如下:
nosee@DESKTOP-FNAF3T1 MINGW64 /g/NoSee/git_web (master)
$ echo /admin/* >> .git/info/sparse-checkout
nosee@DESKTOP-FNAF3T1 MINGW64 /g/NoSee/git_web (master)
$ cat .git/info/sparse-checkout
/static/*
/admin/*
/index.html
nosee@DESKTOP-FNAF3T1 MINGW64 /g/NoSee/git_web (master)
$ git read-tree -mu HEAD
nosee@DESKTOP-FNAF3T1 MINGW64 /g/NoSee/git_web (master)
$ ls -R
.:
index.html static/ admin/
./static:
test1.txt test2.txt test3.txt
.admin:
test4.txt test5.txt
五、更新
更新到遠程倉庫:
nosee@DESKTOP-FNAF3T1 MINGW64 /g/NoSee/git_web (master)
$ touch static/test6.txt
nosee@DESKTOP-FNAF3T1 MINGW64 /g/NoSee/git_web (master)
$ git add static/test6.txt
nosee@DESKTOP-FNAF3T1 MINGW64 /g/NoSee/git_web (master)
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: static/test6.txt
nosee@DESKTOP-FNAF3T1 MINGW64 /g/NoSee/git_web (master)
$ git commit -m '配置稀疏檢出'
[master 0f6ba72] 配置稀疏檢出
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 static/test6.txt
nosee@DESKTOP-FNAF3T1 MINGW64 /g/NoSee/git_web (master)
$ git push
fatal: The current branch master has no upstream branch.
To push the current branch and set the remote as upstream, use
git push --set-upstream origin master
# 注意,第一次提交到遠程倉庫的時候需要關聯遠程分支,不能直接git push
# 使用git push --set-upstream origin master 關聯遠程分支
nosee@DESKTOP-FNAF3T1 MINGW64 /g/NoSee/git_web (master)
$ git push --set-upstream origin master
Enumerating objects: 8, done.
Counting objects: 100% (8/8), done.
Delta compression using up to 4 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (5/5), 410 bytes | 410.00 KiB/s, done.
Total 5 (delta 3), reused 1 (delta 0)
To *.*.*.*:/home/git.git
22c0188..0f6ba72 master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
# 下次更新倉庫就可以直接git push了
《完》