本篇文章給大家?guī)砹岁P(guān)于git的相關(guān)知識,其中主要介紹了git init和git clone獲取git倉庫的相關(guān)問題,包括了git clone 從已有的git存儲數(shù)據(jù)庫中克隆倉庫到本地目錄等相關(guān)內(nèi)容,希望對大家有幫助。
推薦學(xué)習(xí):《git》
使用git init和git clone獲取git倉庫
通常獲取git倉庫有兩種方式:
-
將本地未進行版本控制的本地目錄轉(zhuǎn)換為Git倉庫;
-
從其他服務(wù)器上克隆一個已存在的Git倉庫;
1 git init 在本地目錄上創(chuàng)建Git倉庫
git init [-q | --quiet] [--bare] [--template=<template_Directory>] [--separate-git-dir <git dir>] [--shared[=<permissions>]] [directory]
該命令創(chuàng)建一個空的Git存儲數(shù)據(jù)庫,基本上會在.git目錄中創(chuàng)建objects,refs/heads,refs/tags,和模板文件。還會創(chuàng)建一個引用主分支的HEAD的初始HEAD文件。
如果$GIT_DIR環(huán)境變量被指定了,則會替代./.git目錄作為一個存儲庫的基礎(chǔ)。
如果objects目錄是通過$GIT_OBJECT_DIRECTORY環(huán)境變量指定的,那么在此目錄下創(chuàng)建sha1目錄,否則就是默認(rèn)的$GIT_DIR/objects目錄。
在已有的Git存儲庫中運行g(shù)it init是安全的,他不會覆蓋已存在的東西。重新運行g(shù)it init的主要原因是獲取新添加的模板(或者如果是–separate-git-dir選項,則將Git存儲庫移到另一個地方)。
- [-q, –quite]
只打印錯誤信息和警告信息; - [–bare]
創(chuàng)建一個裸倉庫,不包括.git文件夾,如下: - [–template=
]
用于在初始化Git倉庫時將模板文件夾中的文件拷貝到我們初始化時的.git存儲數(shù)據(jù)庫中,如果不指定,默認(rèn)拷貝的是/usr/share/git-core/templates路徑下的模板,里面包括如下內(nèi)容:$ ls /usr/share/git-core/templates/ branches description hooks info
如果指定自己默認(rèn)路徑則初始化的Git存儲數(shù)據(jù)庫如下:
其中模板依次可通過–template=設(shè)置,$GIT_TEMPLATE_DIR環(huán)境變量設(shè)置,init.templateDir 配置設(shè)置,并且依次覆蓋下一級設(shè)置。 - [–separate-git-dir
]
默認(rèn)git init會在當(dāng)前目錄下創(chuàng)建一個.git文件夾來儲存Git數(shù)據(jù)庫,此命令可指定一個路徑來初始化Git存儲數(shù)據(jù)庫,并在本地創(chuàng)建一個.git文件來鏈接到指定的目錄中去:
可以看到本地只有一個.git文件,文件中描述了當(dāng)前倉庫的Git存儲數(shù)據(jù)庫具體位置在哪里,并自動鏈接過去。 - [–shared[=
]]
用于指定創(chuàng)建的Git存儲數(shù)據(jù)庫的讀寫權(quán)限,包括同組用戶,所有用戶等等權(quán)限設(shè)置,如果沒有指定默認(rèn)是group權(quán)限。感興趣可以git init –help查看此選項具體用法。 - [directory]
如果指定了此選項,git init命令則會在此目錄中運行,如果目錄不存在還會創(chuàng)建該目錄。
2 git clone 從已有的Git存儲數(shù)據(jù)庫中克隆倉庫到本地目錄
git clone [--template=<template_directory>] [-l] [-s] [--no-hardlinks] [-q] [-n] [--bare] [--mirror] [-o <name>] [-b <name>] [-u <upload-pack>] [--reference <repository>] [--dissociate] [--separate-git-dir <git dir>] [--depth <depth>] [--[no-]single-branch] [--no-tags] [--recurse-submodules[=<pathspec>]] [--[no-]shallow-submodules] [--[no-]remote-submodules] [--jobs <n>] [--sparse] [--] <repository> [<directory>]
克隆一個倉庫到新被創(chuàng)建的目錄中,為克隆的Git存儲庫中每個分支創(chuàng)建遠程跟蹤分支(通過git branch –remotes可查看跟蹤分支),并創(chuàng)建和檢出克隆倉庫當(dāng)前活躍的分支到本地初始分支。
克隆完成后,一個不帶參數(shù)的git fetch命令可以更新所有遠程跟蹤分支,并且不帶參數(shù)的git pull命令還會將遠程主分支合并到當(dāng)前分支中。
這個默認(rèn)配置是通過在refs/remotes/origin下創(chuàng)建對遠程分支頭的引用并且初始化remote.origin.url和remote.origin.fetch配置變量實現(xiàn)的。
- [–template=
]
請看git init相關(guān)選項獲取此選項作用。 - [-l, –local]
用于從本地Git存儲倉庫克隆Git存儲數(shù)據(jù)庫,此選項會拷貝本地的refs,HEAD等信息到克隆的Git存儲數(shù)據(jù)庫,并將.git/objects通過硬鏈接形式鏈接到本地Git存儲庫以節(jié)約本地空間。
如果未指定-l選項但[url]是本地路徑則還是會默認(rèn)進行-l選項的行為,但是如果指定的是–no-local選項對本地倉庫進行克隆則會走默認(rèn)的git clone流程: - [-s, –shared]
當(dāng)克隆的倉庫在本地時,默認(rèn)是將本地倉庫中.git/objects的對象通過硬鏈接的方式鏈接到本地的克隆倉庫,使用此選項不會再硬鏈接.git/objects目錄,而是在本地的.git/objects/info目錄中創(chuàng)建一個alternates文件并在其中描述objects原先的位置并進行共享使用。
注意:這個選項是一個危險的選項,除非你明白它的作用,否則不要使用它。如果使用這個選項克隆了本地倉庫,然后刪除了源倉庫中的分支,一些對象可能會變成未被引用狀態(tài)。而這些對象是可能被git的命令(git commit內(nèi)部可能自動調(diào)用git gc –atuo)刪除的,從而導(dǎo)致倉庫被破壞。
還需要注意:在用-s選項克隆的存儲庫中運行g(shù)it repack時,如果沒有指定–local,-l選項,則會將源存儲庫中的objects復(fù)制到克隆存儲庫中的一個包里面,從而消除了–shared選項帶來的共享效果和節(jié)省的空間。直接運行g(shù)it gc是安全的,因為默認(rèn)使用的–local,-l選項。
如果想在-s選項指定的倉庫中打破對共享的依賴,則可以使用git repack -a命令將源存儲庫中的所有對象復(fù)制到克隆的存儲庫的一個包中。 - [–no-hardlinks]
強制在克隆本地倉庫時使用拷貝的形式復(fù)制.git/objects中的內(nèi)容而不是使用硬鏈接的形式,在進行Git存儲庫備份時這個選項就很有用。 - [-q, –quite]
安靜的運行命令,進度不會報告到標(biāo)準(zhǔn)錯誤流中。 - [-n, –no-checkout]
克隆完成后不執(zhí)行檢出HEAD操作: - [–bare]
創(chuàng)建一個裸的Git倉庫。也就是說不創(chuàng)建/.git目錄也不會將管理文件放到 /.git中,而是為自己創(chuàng)建一個 或者 .git目錄,里面保存的就是實際的Git數(shù)據(jù)庫。這個選項也默認(rèn)是–no-checkout的,不會檢出任何HEAD,也不會自動跟蹤任何遠程分支,也不會創(chuàng)建相關(guān)的配置變量。 - [–mirror]
設(shè)置源Git存儲庫的鏡像。類似于–bare,對比–bare,–mirror不僅僅映射源的本地分支到目標(biāo)的本地分支,它還映射所有引用(包括遠程跟蹤分支,筆記等),并設(shè)置refspec配置,以便所有這些引用都被目標(biāo)存儲庫中的git遠程更新覆蓋。
注意:–bare和–mirror都是針對服務(wù)器使用,因為服務(wù)器只需要保存Git存儲數(shù)據(jù)庫而不需要實際操作git命令,所以當(dāng)你在這兩個選項創(chuàng)建的存儲庫執(zhí)行Git命令會得到下面的打印:fatal: this operation must be run in a work tree
- [-o
, –origin ]
未使用此選項時默認(rèn)使用origin來跟蹤遠程倉庫,使用此選項后使用來跟蹤遠程倉庫。 - [-b
, –branch ]
不要將新創(chuàng)建的HEAD指向克隆倉庫HEAD指向的分支,而是指向分支。 - [-u
, –upload-pack ]
在使用ssh訪問要克隆的Git存儲庫時,它為另一端運行的命令指定了一個非默認(rèn)的路徑。這個選項主要針對Git服務(wù)器使用,為服務(wù)器使用的git等指定了一個路徑。一般是/usr/bin/git-upload-pack,當(dāng)服務(wù)器的git運行時會自動找到此路徑的程序。 - [–reference[-if-able]
]
如果引用的Git存儲庫在本地機器上,自動的會設(shè)置.git/objects/info/alternates文件來從引用源存儲庫來獲取objects,使用已經(jīng)存在的Git存儲庫作為替代將會需要更少的objects被從源存儲庫拷貝過來,從而降低網(wǎng)絡(luò)和本地存儲成本。當(dāng)使用–reference-if-able時,會跳過不存在的目錄,并發(fā)出警告,而不是中止克隆。 - [–dissociate]
從–reference引用的Git存儲庫借用objects對象僅減少網(wǎng)絡(luò)傳輸,并且在通過對借用objects進行必要的本地復(fù)制來進行克隆后,停止從引用庫中借用對象。當(dāng)本地克隆已經(jīng)從另一個存儲庫借用objects時,可以使用此選項來停止新存儲庫從相同的存儲庫借用objects。此選項也主要用于Git服務(wù)器。 - [–separate-git-dir
]
請看git init相關(guān)選項獲取此選項作用。 - [–depth
]
創(chuàng)建一個淺克隆,其需要克隆的提交數(shù)量由指定,并獲取所有分支頂部提交往后 提交數(shù)量克隆到本地。如果也想簡單克隆子模塊也可以傳遞–shallow-submodules選項。 - [–[no-]single-branch]
顧名思義,–single-branch只會克隆Git存儲庫中指定的一個分支,遠程Git存儲庫中其他分支不會在本地被克隆下來,也不會在本地跟蹤其他遠程分支,只會跟蹤單個遠程分支。 - [–no-tags]
不會克隆任何標(biāo)簽下來,并且在配置中設(shè)置remote..tarOpt=–no-tags,以確保后續(xù)git pull和git fetch也不會操作到標(biāo)簽,除非顯式的操作標(biāo)簽。
可以與–single-branch一起使用,以維護單個分支,在只維護某個缺省分支時很有用。 - [–recurse-submodules[=
]]
克隆創(chuàng)建后,根據(jù)提供的初始化并克隆子模塊,如果沒有指定 則所有子模塊都被初始化和克隆。對于有多個條目的 可以多次給出此選項。
使用默認(rèn)的此選項,相當(dāng)于運行g(shù)it submodule update –init –recursive。 - [–[no-]shallow-submodules]
所有被克隆的子模塊都淺克隆深度為1。 - [–[no-]remote-submodules]
所有被克隆的子模塊的遠程跟蹤分支的狀態(tài)來更新子模塊,而不是記錄在Git數(shù)據(jù)庫中的SHA1。相當(dāng)于將–remote選項傳遞給git submodule update。 - [-j
, –jobs ]
同時取出的子模塊數(shù),默認(rèn)是配置submodule.fetchJobs。 - [–sparse]
稀疏檢出模式,所謂稀疏檢出就是本地版本庫檢出時不檢出全部,只將指定的文件從本地版本庫檢出到工作區(qū),而其他未指定的文件則不予檢出(即使這些文件存在于工作區(qū),其修改也會被忽略)。這里不詳細介紹此功能。 - [–]
無實際作用,只是為了將選項和操作對象分開以便易于區(qū)分。
要克隆的倉庫,可能是遠程倉庫,也可能是本地倉庫,可以是https協(xié)議也可以是ssh協(xié)議或者git協(xié)議等等。- [
]
如果指定了此目錄,則會將Git倉庫克隆到此目錄中。 - -v, –verbose
冗長輸出克隆信息。 - [-c
= , –config = 在克隆倉庫時為新創(chuàng)建的Git存儲庫設(shè)置一個配置變量,在克隆完成后立即生效
推薦學(xué)習(xí):《git》