5.md 13.3 KB
Newer Older
W
init  
wizardforcel 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
# git-clone

> 原文: [https://git-scm.com/docs/git-clone](https://git-scm.com/docs/git-clone)

## 名称

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>]
```

## 描述

H
honglyua 已提交
23
将存储库克隆到新创建的目录中,为克隆存储库中的每个分支创建远程跟踪分支(使用`git branch -r`可见),并创建并检出从克隆存储库的当前活动分支的初始分支。
W
init  
wizardforcel 已提交
24

H
honglyua 已提交
25
在克隆之后,没有参数的普通`git fetch`将更新所有远程跟踪分支,并且没有参数的`git pull`将另外将远程主分支合并到当前主分支中(如果有"--single-branch“的话,见下文)。
W
init  
wizardforcel 已提交
26 27 28

通过在`refs/remotes/origin`下创建对远程分支头的引用并初始化`remote.origin.url``remote.origin.fetch`配置变量来实现此默认配置。

H
honglyua 已提交
29
## 选项
W
init  
wizardforcel 已提交
30 31 32 33 34 35 36 37 38

```
 --local 
```

```
 -l 
```

H
honglyua 已提交
39
当要克隆的存储库位于本地计算机上时,此标志会绕过正常的“Git感知”传输机制,并通过制作HEAD以及对象和refs目录下的所有内容的副本来克隆存储库。 `.git/objects/`目录下的文件是硬链接的,以便在可能的情况下节省空间。
W
init  
wizardforcel 已提交
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58

如果将存储库指定为本地路径(例如,`/path/to/repo`),则这是默认值,而--local本质上是无操作。如果将存储库指定为URL,则忽略此标志(并且我们从不使用本地优化)。当给出`/path/to/repo`时,指定`--no-local`将覆盖默认值,而是使用常规Git传输。

```
 --no-hardlinks 
```

从本地文件系统上的存储库强制克隆进程,以复制`.git/objects`目录下的文件,而不是使用硬链接。如果您尝试备份存储库,则可能需要这样做。

```
 --shared 
```

```
 -s 
```

当要克隆的存储库位于本地计算机上而不是使用硬链接时,会自动设置`.git/objects/info/alternates`以与源存储库共享对象。生成的存储库在没有任何自己的对象的情况下开始。

H
honglyua 已提交
59
**注**:这可能是危险的操作;**不要**使用它,除非你明白它的作用。如果使用此选项克隆存储库,然后在源存储库中删除分支(或使用任何其他提交未引用的Git命令),则某些对象可能会变为未引用(或悬空)。这些对象可以通过自动调用`git gc --auto`的普通Git操作(例如`git commit`)删除。 (参见 [git-gc [1]](https://git-scm.com/docs/git-gc) 。)如果这些对象被删除并被克隆的存储库引用,那么克隆的存储库将会损坏。
W
init  
wizardforcel 已提交
60 61 62 63 64 65 66 67 68

请注意,在使用`-s`克隆的存储库中运行没有`-l`选项的`git repack`会将源存储库中的对象复制到克隆存储库中的包中,从而节省`clone -s`的磁盘空间节省。但是,运行`git gc`是安全的,它默认使用`-l`选项。

如果要在其源存储库中中断使用`-s`克隆的存储库的依赖关系,只需运行`git repack -a`即可将源存储库中的所有对象复制到克隆存储库中的包中。

```
 --reference[-if-able] <repository> 
```

H
honglyua 已提交
69
如果引用存储库位于本地计算机上,则自动设置`.git/objects/info/alternates`以从引用存储库获取对象。使用现有存储库作为备用存储库,将需要从克隆的存储库中复制更少的对象,从而降低网络和本地存储成本。使用`--reference-if-able`时,将跳过不存在的目录,并显示警告而不是中止克隆。
W
init  
wizardforcel 已提交
70 71 72 73 74 75 76

**注**:参见`--shared`选项的注释,以及`--dissociate`选项。

```
 --dissociate 
```

H
honglyua 已提交
77
借用`--reference`选项指定的引用存储库中的对象,仅减少网络传输,并在通过制作必要的借用对象本地副本进行克隆后停止从它们借用。当已经从另一个存储库借用对象的存储库本地克隆时,也可以使用此选项 - 新存储库将从同一存储库中借用对象,并且此选项可用于停止借用。
W
init  
wizardforcel 已提交
78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118

```
 --quiet 
```

```
 -q 
```

安静地操作。未向标准错误流报告进度。

```
 --verbose 
```

```
 -v 
```

详细地运行。不影响将进度状态报告给标准错误流。

```
 --progress 
```

除非指定了-q,否则在将标准错误流附加到终端时,默认情况下会报告进度状态。即使标准错误流未定向到终端,此标志也会强制进度状态。

```
 --no-checkout 
```

```
 -n 
```

克隆完成后不会检查HEAD。

```
 --bare 
```

H
honglyua 已提交
119
制作一个 _bare_ Git存储库。也就是说,不是创建`<directory>`并将管理文件放在`<directory>/.git`中,而是将`<directory>`本身设为`$GIT_DIR`。这显然意味着`-n`,因为无处可查看工作树。此外,远端上的分支头直接复制到相应的本地分支头,而不将它们映射到`refs/remotes/origin/`。使用此选项时,既不会创建远程跟踪分支,也不会创建相关的配置变量。
W
init  
wizardforcel 已提交
120 121 122 123 124

```
 --mirror 
```

H
honglyua 已提交
125
设置源存储库的镜像。这类似`--bare`。与`--bare`相比,`--mirror`不仅将源的本地分支映射到目标的本地分支,它还映射所有引用(包括远程跟踪分支,注释等)并设置refspec配置,以便所有这些引用被目标存储库中的`git remote update`覆盖。
W
init  
wizardforcel 已提交
126 127 128 129 130 131 132 133 134

```
 --origin <name> 
```

```
 -o <name> 
```

H
honglyua 已提交
135
不使用远程名称`origin`来跟踪上游存储库,而是使用`<name>`
W
init  
wizardforcel 已提交
136 137 138 139 140 141 142 143 144

```
 --branch <name> 
```

```
 -b <name> 
```

H
honglyua 已提交
145
而不是将新创建的HEAD指向克隆存储库的HEAD所指向的分支,而是指向`<name>`分支。在非裸存储库中,这是将要检出的分支。 `--branch`还可以在生成的存储库中的获取tags和分离HEAD。
W
init  
wizardforcel 已提交
146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170

```
 --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> 
```

H
honglyua 已提交
171
在新创建的存储库中设置配置变量;这在初始化存储库之后,但在获取远程历史记录或检出任何文件之前立即生效。key的格式与 [git-config [1]](https://git-scm.com/docs/git-config) (例如`core.eol=true`)的格式相同。如果为同一个键指定了多个值,则每个值都将写入配置文件。例如,这样就可以安全地向源远程添加额外的fetch refspec。
W
init  
wizardforcel 已提交
172

H
honglyua 已提交
173
由于当前实现的限制,一些配置变量在初始提取和检出之后才会生效。已知未生效的配置变量为:`remote.<name>.mirror``remote.<name>.tagOpt`。请改用相应的`--mirror``--no-tags`选项。
W
init  
wizardforcel 已提交
174 175 176 177 178

```
 --depth <depth> 
```

H
honglyua 已提交
179
创建一个 _浅_ 克隆,其历史记录被截断为指定的提交次数。除非`--no-single-branch`用于获取所有分支的提示附近的历史,否则意味着`--single-branch`。如果要浅层克隆子模块,也要传递`--shallow-submodules`
W
init  
wizardforcel 已提交
180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202

```
 --shallow-since=<date> 
```

在指定时间后创建具有历史记录的浅层克隆。

```
 --shallow-exclude=<revision> 
```

创建具有历史记录的浅层克隆,不包括可从指定的远程分支或标记访问的提交。可以多次指定此选项。

```
 --[no-]single-branch 
```

仅克隆导致单个分支尖端的历史记录,由`--branch`选项指定或主分支远程的`HEAD`指向。进一步提取到生成的存储库只会更新分支的远程跟踪分支,此选项用于初始克隆。如果在进行`--single-branch`克隆时远程处的HEAD未指向任何分支,则不会创建远程跟踪分支。

```
 --no-tags 
```

H
honglyua 已提交
203
不要克隆任何标签,并在配置中设置`remote.<remote>.tagOpt=--no-tags`,确保将来的`git pull``git fetch`操作不会跟随任何标签。后续显式标记提取仍然有效(参见 [git-fetch [1]](https://git-scm.com/docs/git-fetch) )。
W
init  
wizardforcel 已提交
204 205 206 207 208 209 210

可以与`--single-branch`一起使用来克隆和维护一个除了单个克隆分支之外没有引用的分支。这很有用,例如维护某些存储库的默认分支的最小克隆以进行搜索索引。

```
 --recurse-submodules[=<pathspec] 
```

H
honglyua 已提交
211
创建克隆后,根据提供的pathspec初始化和克隆子模块。如果未提供pathspec,则初始化并克隆所有子模块。对于包含多个条目的pathspec,可以多次给出此选项。生成的克隆将`submodule.active`设置为提供的pathspec,或“.” (如果没有提供pathspec,则表示所有子模块)。
W
init  
wizardforcel 已提交
212

H
honglyua 已提交
213
子模块使用其默认设置进行初始化和克隆。这相当于克隆完成后立即运行`git submodule update --init --recursive <pathspec>`。如果克隆的存储库没有工作树/检出(即,如果给出`--no-checkout` / `-n``--bare``--mirror`中的任何一个),则忽略此选项
W
init  
wizardforcel 已提交
214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268

```
 --[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协议一起使用:

H
honglyua 已提交
269
*   [用户@] host.xz:path/to/ repo.git /
W
init  
wizardforcel 已提交
270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288

只有在第一个冒号之前没有斜杠时才会识别此语法。这有助于区分包含冒号的本地路径。例如,本地路径`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选项。

H
honglyua 已提交
289
当Git不知道如何处理某种传输协议时,它会尝试使用 _remote-<transport>_ 远程助手,如果存在的话。要显式请求远程帮助程序,可以使用以下语法:
W
init  
wizardforcel 已提交
290

H
honglyua 已提交
291
*   <transport>::<address>
W
init  
wizardforcel 已提交
292

H
honglyua 已提交
293
其中<address>可以是路径,服务器,或者由被调用的特定远程助手识别的任意类似URL的字符串。有关详细信息,请参阅 [gitremote-helpers [1]](https://git-scm.com/docs/gitremote-helpers)
W
init  
wizardforcel 已提交
294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309

如果存在大量具有相似名称的远程存储库,并且您希望为它们使用不同的格式(以便将您使用的URL重写为有效的URL),则可以创建表单的配置部分:

```
	[url "<actual url base>"]
		insteadOf = <other url base>
```

例如,有了这个:

```
	[url "git://git.host.xz/"]
		insteadOf = host.xz:/path/to/
		insteadOf = work:
```

H
honglyua 已提交
310
像“work:repo.git”这样的URL或类似“host.xz:/path/to/repo.git”的URL将在任何带有URL的上下文中被重写为“git://git.host.xz/repo.git”。
W
init  
wizardforcel 已提交
311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363

如果要为仅推送重写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) 套件