Git檢出指定目錄或文件(配置稀疏檢出)

一、簡介

從 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了

《完》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章