Skip to content
This repository was archived by the owner on May 6, 2021. It is now read-only.

Latest commit

 

History

History
365 lines (239 loc) · 13.3 KB

5.md

File metadata and controls

365 lines (239 loc) · 13.3 KB

git-clone

原文: https://git-scm.com/docs/git-clone

贡献者: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.urlremote.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] 。)如果这些对象被删除并被克隆的存储库引用,那么克隆的存储库将会损坏。

请注意,在使用-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] 的“TEMPLATE DIRECTORY”部分。)

 --config <key>=<value> 
 -c <key>=<value> 

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

由于当前实现的限制,一些配置变量在初始提取和检出之后才会生效。已知未生效的配置变量为:remote.<name>.mirrorremote.<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 pullgit fetch操作不会跟随任何标签。后续显式标记提取仍然有效(参见 git-fetch [1] )。

可以与--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 部分。

 <directory> 

要克隆到的新目录的名称。如果没有明确给出目录(/path/to/repo.git/path/to/repo.githost.xz:foo/.gitfoo),则使用源存储库的“人性化”部分。仅当目录为空时才允许克隆到现有目录中。

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- 远程助手,如果存在的话。要显式请求远程帮助程序,可以使用以下语法:

  • ::

其中

可以是路径,服务器,或者由被调用的特定远程助手识别的任意类似URL的字符串。有关详细信息,请参阅 gitremote-helpers [1]

如果存在大量具有相似名称的远程存储库,并且您希望为它们使用不同的格式(以便将您使用的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] 套件