# git-clone
> 原文: [https://git-scm.com/docs/git-clone](https://git-scm.com/docs/git-clone)
>
> 貢獻者:[honglyua](https://github.com/honglyua)
## 名稱
git-clone - 將存儲庫克隆到新目錄中
## 概要
```
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]
[--jobs <n>] [--] <repository> [<directory>]
```
## 描述
將存儲庫克隆到新創建的目錄中,為克隆存儲庫中的每個分支創建遠程跟蹤分支(使用`git branch -r`可見),并創建并檢出從克隆存儲庫的當前活動分支的初始分支。
在克隆之后,沒有參數的普通`git fetch`將更新所有遠程跟蹤分支,并且沒有參數的`git pull`將另外將遠程主分支合并到當前主分支中(如果有"--single-branch“的話,見下文)。
通過在`refs/remotes/origin`下創建對遠程分支頭的引用并初始化`remote.origin.url`和`remote.origin.fetch`配置變量來實現此默認配置。
## 選項
```
--local
```
```
-l
```
當要克隆的存儲庫位于本地計算機上時,此標志會繞過正常的“Git感知”傳輸機制,并通過制作HEAD以及對象和refs目錄下的所有內容的副本來克隆存儲庫。 `.git/objects/`目錄下的文件是硬鏈接的,以便在可能的情況下節省空間。
如果將存儲庫指定為本地路徑(例如,`/path/to/repo`),則這是默認值,而--local本質上是無操作。如果將存儲庫指定為URL,則忽略此標志(并且我們從不使用本地優化)。當給出`/path/to/repo`時,指定`--no-local`將覆蓋默認值,而是使用常規Git傳輸。
```
--no-hardlinks
```
從本地文件系統上的存儲庫強制克隆進程,以復制`.git/objects`目錄下的文件,而不是使用硬鏈接。如果您嘗試備份存儲庫,則可能需要這樣做。
```
--shared
```
```
-s
```
當要克隆的存儲庫位于本地計算機上而不是使用硬鏈接時,會自動設置`.git/objects/info/alternates`以與源存儲庫共享對象。生成的存儲庫在沒有任何自己的對象的情況下開始。
**注**:這可能是危險的操作;**不要**使用它,除非你明白它的作用。如果使用此選項克隆存儲庫,然后在源存儲庫中刪除分支(或使用任何其他提交未引用的Git命令),則某些對象可能會變為未引用(或懸空)。這些對象可以通過自動調用`git gc --auto`的普通Git操作(例如`git commit`)刪除。 (參見 [git-gc [1]](https://git-scm.com/docs/git-gc) 。)如果這些對象被刪除并被克隆的存儲庫引用,那么克隆的存儲庫將會損壞。
請注意,在使用`-s`克隆的存儲庫中運行沒有`-l`選項的`git repack`會將源存儲庫中的對象復制到克隆存儲庫中的包中,從而節省`clone -s`的磁盤空間節省。但是,運行`git gc`是安全的,它默認使用`-l`選項。
如果要在其源存儲庫中中斷使用`-s`克隆的存儲庫的依賴關系,只需運行`git repack -a`即可將源存儲庫中的所有對象復制到克隆存儲庫中的包中。
```
--reference[-if-able] <repository>
```
如果引用存儲庫位于本地計算機上,則自動設置`.git/objects/info/alternates`以從引用存儲庫獲取對象。使用現有存儲庫作為備用存儲庫,將需要從克隆的存儲庫中復制更少的對象,從而降低網絡和本地存儲成本。使用`--reference-if-able`時,將跳過不存在的目錄,并顯示警告而不是中止克隆。
**注**:參見`--shared`選項的注釋,以及`--dissociate`選項。
```
--dissociate
```
借用`--reference`選項指定的引用存儲庫中的對象,僅減少網絡傳輸,并在通過制作必要的借用對象本地副本進行克隆后停止從它們借用。當已經從另一個存儲庫借用對象的存儲庫本地克隆時,也可以使用此選項 - 新存儲庫將從同一存儲庫中借用對象,并且此選項可用于停止借用。
```
--quiet
```
```
-q
```
安靜地操作。未向標準錯誤流報告進度。
```
--verbose
```
```
-v
```
詳細地運行。不影響將進度狀態報告給標準錯誤流。
```
--progress
```
除非指定了-q,否則在將標準錯誤流附加到終端時,默認情況下會報告進度狀態。即使標準錯誤流未定向到終端,此標志也會強制進度狀態。
```
--no-checkout
```
```
-n
```
克隆完成后不會檢查HEAD。
```
--bare
```
制作一個 _bare_ Git存儲庫。也就是說,不是創建`<directory>`并將管理文件放在`<directory>/.git`中,而是將`<directory>`本身設為`$GIT_DIR`。這顯然意味著`-n`,因為無處可查看工作樹。此外,遠端上的分支頭直接復制到相應的本地分支頭,而不將它們映射到`refs/remotes/origin/`。使用此選項時,既不會創建遠程跟蹤分支,也不會創建相關的配置變量。
```
--mirror
```
設置源存儲庫的鏡像。這類似`--bare`。與`--bare`相比,`--mirror`不僅將源的本地分支映射到目標的本地分支,它還映射所有引用(包括遠程跟蹤分支,注釋等)并設置refspec配置,以便所有這些引用被目標存儲庫中的`git remote update`覆蓋。
```
--origin <name>
```
```
-o <name>
```
不使用遠程名稱`origin`來跟蹤上游存儲庫,而是使用`<name>`。
```
--branch <name>
```
```
-b <name>
```
而不是將新創建的HEAD指向克隆存儲庫的HEAD所指向的分支,而是指向`<name>`分支。在非裸存儲庫中,這是將要檢出的分支。 `--branch`還可以在生成的存儲庫中的獲取tags和分離HEAD。
```
--upload-pack <upload-pack>
```
```
-u <upload-pack>
```
給定時,通過ssh訪問要克隆的存儲庫,這將指定另一端運行的命令的非默認路徑。
```
--template=<template_directory>
```
指定將使用模板的目錄; (參見 [git-init [1]](https://git-scm.com/docs/git-init) 的“TEMPLATE DIRECTORY”部分。)
```
--config <key>=<value>
```
```
-c <key>=<value>
```
在新創建的存儲庫中設置配置變量;這在初始化存儲庫之后,但在獲取遠程歷史記錄或檢出任何文件之前立即生效。key的格式與 [git-config [1]](https://git-scm.com/docs/git-config) (例如`core.eol=true`)的格式相同。如果為同一個鍵指定了多個值,則每個值都將寫入配置文件。例如,這樣就可以安全地向源遠程添加額外的fetch refspec。
由于當前實現的限制,一些配置變量在初始提取和檢出之后才會生效。已知未生效的配置變量為:`remote.<name>.mirror`和`remote.<name>.tagOpt`。請改用相應的`--mirror`和`--no-tags`選項。
```
--depth <depth>
```
創建一個 _淺_ 克隆,其歷史記錄被截斷為指定的提交次數。除非`--no-single-branch`用于獲取所有分支的提示附近的歷史,否則意味著`--single-branch`。如果要淺層克隆子模塊,也要傳遞`--shallow-submodules`。
```
--shallow-since=<date>
```
在指定時間后創建具有歷史記錄的淺層克隆。
```
--shallow-exclude=<revision>
```
創建具有歷史記錄的淺層克隆,不包括可從指定的遠程分支或標記訪問的提交。可以多次指定此選項。
```
--[no-]single-branch
```
僅克隆導致單個分支尖端的歷史記錄,由`--branch`選項指定或主分支遠程的`HEAD`指向。進一步提取到生成的存儲庫只會更新分支的遠程跟蹤分支,此選項用于初始克隆。如果在進行`--single-branch`克隆時遠程處的HEAD未指向任何分支,則不會創建遠程跟蹤分支。
```
--no-tags
```
不要克隆任何標簽,并在配置中設置`remote.<remote>.tagOpt=--no-tags`,確保將來的`git pull`和`git fetch`操作不會跟隨任何標簽。后續顯式標記提取仍然有效(參見 [git-fetch [1]](https://git-scm.com/docs/git-fetch) )。
可以與`--single-branch`一起使用來克隆和維護一個除了單個克隆分支之外沒有引用的分支。這很有用,例如維護某些存儲庫的默認分支的最小克隆以進行搜索索引。
```
--recurse-submodules[=<pathspec]
```
創建克隆后,根據提供的pathspec初始化和克隆子模塊。如果未提供pathspec,則初始化并克隆所有子模塊。對于包含多個條目的pathspec,可以多次給出此選項。生成的克隆將`submodule.active`設置為提供的pathspec,或“.” (如果沒有提供pathspec,則表示所有子模塊)。
子模塊使用其默認設置進行初始化和克隆。這相當于克隆完成后立即運行`git submodule update --init --recursive <pathspec>`。如果克隆的存儲庫沒有工作樹/檢出(即,如果給出`--no-checkout` / `-n`,`--bare`或`--mirror`中的任何一個),則忽略此選項
```
--[no-]shallow-submodules
```
克隆的所有子模塊都是淺的,深度為1。
```
--separate-git-dir=<git dir>
```
不要將克隆的存儲庫放在應該位于的位置,而是將克隆的存儲庫放在指定的目錄中,然后創建與文件系統無關的Git符號鏈接。結果是Git存儲庫可以與工作樹分開。
```
-j <n>
```
```
--jobs <n>
```
同時獲取的子模塊數。默認為`submodule.fetchJobs`選項。
```
<repository>
```
要從中克隆的(可能是遠程的)存儲庫。有關指定存儲庫的更多信息,請參見下面的 [GIT URL](#URLS) 部分。
```
<directory>
```
要克隆到的新目錄的名稱。如果沒有明確給出目錄(`/path/to/repo.git`為`/path/to/repo.git`,`host.xz:foo/.git`為`foo`),則使用源存儲庫的“人性化”部分。僅當目錄為空時才允許克隆到現有目錄中。
## GIT網址
通常,URL包含有關傳輸協議,遠程服務器的地址以及存儲庫路徑的信息。根據傳輸協議,可能缺少某些信息。
Git支持ssh,git,http和https協議(此外,ftp和ftps可用于獲取,但這是低效的并且已棄用;請勿使用它)。
本機傳輸(即git:// URL)不進行身份驗證,應在不安全的網絡上謹慎使用。
可以使用以下語法:
* SSH:// [用戶@] host.xz [:端口] /path/to/repo.git/
* GIT中://host.xz [:端口] /path/to/repo.git/
* HTTP [S]://host.xz [:端口] /path/to/repo.git/
* FTP [S]://host.xz [:端口] /path/to/repo.git/
另一種類似scp的語法也可以與ssh協議一起使用:
* [用戶@] host.xz:path/to/ repo.git /
只有在第一個冒號之前沒有斜杠時才會識別此語法。這有助于區分包含冒號的本地路徑。例如,本地路徑`foo:bar`可以指定為絕對路徑或`./foo:bar`,以避免被誤解為ssh url。
ssh和git協議還支持?用戶名擴展:
* SSH:// [用戶@] host.xz [:端口] /?[用戶] /path/to/repo.git/
* GIT中://host.xz [:端口] /?[用戶] /path/to/repo.git/
* [用戶@] host.xz:/?[用戶] /path/to/repo.git/
對于本地也受Git支持的本地存儲庫,可以使用以下語法:
* /path/to/repo.git/
* 文件:///path/to/repo.git/
這兩種語法大多是等價的,除了前者暗示--local選項。
當Git不知道如何處理某種傳輸協議時,它會嘗試使用 _remote-<transport>_ 遠程助手,如果存在的話。要顯式請求遠程幫助程序,可以使用以下語法:
* <transport>::<address>
其中<address>可以是路徑,服務器,或者由被調用的特定遠程助手識別的任意類似URL的字符串。有關詳細信息,請參閱 [gitremote-helpers [1]](https://git-scm.com/docs/gitremote-helpers) 。
如果存在大量具有相似名稱的遠程存儲庫,并且您希望為它們使用不同的格式(以便將您使用的URL重寫為有效的URL),則可以創建表單的配置部分:
```
[url "<actual url base>"]
insteadOf = <other url base>
```
例如,有了這個:
```
[url "git://git.host.xz/"]
insteadOf = host.xz:/path/to/
insteadOf = work:
```
像“work:repo.git”這樣的URL或類似“host.xz:/path/to/repo.git”的URL將在任何帶有URL的上下文中被重寫為“git://git.host.xz/repo.git”。
如果要為僅推送重寫URL,可以創建表單的配置部分:
```
[url "<actual url base>"]
pushInsteadOf = <other url base>
```
例如,有了這個:
```
[url "ssh://example.org/"]
pushInsteadOf = git://example.org/
```
像“git://example.org/path/to/repo.git”這樣的網址將被重寫為“ssh://example.org/path/to/repo.git”以進行推送,但是pull仍會使用原始網址。
## 例子
* 從上游克隆:
```
$ git clone git://git.kernel.org/pub/scm/.../linux.git my-linux
$ cd my-linux
$ make
```
* 創建一個從當前目錄借用的本地克隆,而不檢查:
```
$ git clone -l -s -n . ../copy
$ cd ../copy
$ git show-branch
```
* 從現有本地目錄借用時從上游克隆:
```
$ git clone --reference /git/linux.git \
git://git.kernel.org/pub/scm/.../linux.git \
my-linux
$ cd my-linux
```
* 創建一個裸存儲庫以將更改發布到公共:
```
$ git clone --bare -l /home/proj/.git /pub/scm/proj.git
```
## GIT
部分 [git [1]](https://git-scm.com/docs/git) 套件
- git
- git-config
- git-help
- git-init
- git-clone
- git-add
- git-status
- git-diff
- git-commit
- git-reset
- git-rm
- git-mv
- git-branch
- git-checkout
- git-merge
- git-mergetool
- git-log
- git-stash
- git-tag
- git-worktree
- git-fetch
- git-pull
- git-push
- git-remote
- git-submodule
- git-show
- git-log
- git-shortlog
- git-describe
- git-apply
- git-cherry-pick
- git-rebase
- git-revert
- git-bisect
- git-blame
- git-grep
- gitattributes
- giteveryday
- gitglossary
- githooks
- gitignore
- gitmodules
- gitrevisions
- gittutorial
- gitworkflows
- git-am
- git-format-patch
- git-send-email
- git-request-pull
- git-svn
- git-fast-import
- git-clean
- git-gc
- git-fsck
- git-reflog
- git-filter-branch
- git-instaweb
- git-archive
- git-bundle
- git-daemon
- git-update-server-info
- git-cat-file
- git-check-ignore
- git-checkout-index
- git-commit-tree
- git-count-objects
- git-diff-index
- git-for-each-ref
- git-hash-object
- git-ls-files
- git-merge-base
- git-read-tree
- git-rev-list
- git-rev-parse
- git-show-ref
- git-symbolic-ref
- git-update-index
- git-update-ref
- git-verify-pack
- git-write-tree