Git
简体中文 ▾ Topics ▾ Latest version ▾ git-clone last updated in 2.46.0

名称

git-clone - 克隆一个仓库到新目录

概述

git clone [--template=<模板目录>]
	  [-l] [-s] [--no-hardlinks] [-q] [-n] [--bare] [--mirror]
	  [-o <名称>] [-b <名称>] [-u <上传包>] [--reference <仓库>]
	  [--dissociate] [--separate-git-dir <Git 目录>]
	  [--depth <深度>] [--[no-]single-branch] [--no-tags]
	  [--recurse-submodules[=<路径规范>]] [--[no-]shallow-submodules]
	  [--[no-]remote-submodules] [--jobs <n>] [--sparse] [--[no-]reject-shallow]
	  [--filter=<过滤器> [--also-filter-submodules]] [--] <仓库>
	  [<目录>]

描述

将仓库克隆到新创建的目录中,为克隆仓库中的每个分支创建远程跟踪分支(使用 git branch --remotes 可见),并创建、签出从克隆仓库当前活动的分支派生的初始分支。

克隆后,执行不带参数的 git fetch 命令将更新所有远程跟踪的分支,执行不带参数的 git pull 命令将另把远程 master 分支合并到当前 master 分支(如果存在)(如果附加 "--single-branch" 参数,则情况不同;请参阅下文)。

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

选项

-l
--local

当要从中进行克隆的仓库位于本地计算机上时,此标志会绕过常规的 “Git感知” 传输机制,并通过为 HEAD 以及对象和引用目录内的所有内容创建副本以克隆仓库。尽可能将 .git / objects / 目录下的文件进行硬链接以节省空间。

如果将存储库指定为本地路径(例如,/path/to/repo),--local 参数实质上是不起作用的。如果将仓库指定为 URL,则忽略此标志(不使用本地优化)。指定 --no-local 将在给定 /path/to/repo 时覆盖默认值,而使用常规 Git 传输方式。

如果仓库的 $GIT_DIR/objects 有符号链接或者它就是符号链接,克隆将会失败。这是一项安全措施,以防止通过解读符号链接意外地复制文件。

注意:此操作可能会与源仓库的并发修改发生冲突,类似于在修改 src 时运行 cp -r src dst

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

-s
--shared

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

注意:这可能是一个危险的操作;除非你了解它的作用,否则*不要*使用它。如果使用该选项克隆源仓库,然后删除源仓库中的分支(或使用任何其他 Git 命令使现有提交不再被引用),一些对象可能会变得不再被引用(或悬空)。这些对象可能会被自动调用 git maintenance run --auto 的正常 Git 操作(如 git commit)移除。(参见 git-maintenance[1])如果这些对象被移除,并被克隆的版本库引用,那么克隆的版本库就会损坏。

请注意,在使用 --shared 选项克隆的仓库中运行不带 --local 选项的 git repack 命令会将源仓库中的对象复制到克隆存储库中的包中,从而消除使用 clone --shared 节省的磁盘空间。不过,运行 git-gc 是安全的,它默认使用 --local 选项。

如果要断开用 --shared 克隆的仓库对其源仓库的依赖关系,只需运行 git repack -a 即可将源仓库中的所有对象复制到克隆仓库中的一个包中。

--reference[-if-able] <仓库>

如果引用仓库位于本地计算机上,则自动设置 .git / objects / info / alternates 以从引用仓库重获取对象。使用现有的仓库作为备用仓库,则将需要从要克隆的仓库中复制较少的对象,从而降低了网络和本地存储成本。当使用 --reference-if-able 时,不存在的目录会被警告跳过,而不是中止克隆。

注意:请参阅 --shared 选项的注释,以及 --dissociate 选项。

--dissociate

从用 --reference 选项指定的引用仓库中借用对象仅是为了减少网络传输,并在克隆后通过制作借用对象的必要本地副本来停止从对象借用。当从已经从另一个仓库借用对象的存储库进行本地克隆时,也可以使用此选项:新仓库将从同一个仓库借用对象,并且该选项可用于停止借用。

-q
--quiet

静默操作。进度不会报告给标准错误流。

-v
--verbose

冗余运行。不影响向标准错误流报告进度状态。

--progress

默认情况下,附加到终端时,会将进度状态报告给标准错误流,除非指定了 --quiet 选项。即使标准错误流未定向到终端,该标志也会强制显示进度状态。

--server-option=<选项>

使用协议版本2进行通信时,将给定的字符串传输到服务器。给定的字符串不得包含NUL或LF字符。服务器对服务器选项(包括未知选项)的处理是取决于服务器。当给出多个`--server-option=<option>`时,它们都按照命令行中列出的顺序发送到另一端。

-n
--no-checkout

克隆完成后,不执行 HEAD 检出操作。

--[no-]reject-shallow

如果源仓库是一个浅层仓库,则失败。 clone.rejectShallow 配置变量可以用来指定默认值。

--bare

创建一个 ‘裸’ Git 仓库。也就是说,不要创建 <目录> 并将管理文件放在 <目录>/.git,而是将 <目录> 本身设为 $GIT_DIR。这显然暗含着 --no-checkout 选项,因为没有地方可以检出工作目录树。此外,远程的分支头直接复制到相应的本地分支头,而不将它们映射到 refs/remotes/origin/。使用此选项时,不会创建远程跟踪分支或相关配置变量。

--sparse

使用稀疏检出(sparse-checkout),最初只检出顶层目录中的文件。 git-sparse-checkout[1] 命令可根据需要扩大工作目录。

--filter=<过滤器定义>

使用部分克隆功能,要求服务器根据给定的对象过滤器发送一个可到达的对象的子集。当使用 --filter 选项时,提供的 <过滤规则> 将被用于部分克隆过滤器。例如,--filter=blob:none 将过滤掉所有的数据对象(文件内容),直到 Git 需要相应的数据。另外,--filter=blob:limit=<大小> 将过滤掉所有文件大小至少为 <大小> 的数据对象。关于过滤器定义的更多细节,请参阅 git-rev-list[1] 中的 --filter 选项。

--also-filter-submodules

同时对仓库中的任何子模块应用部分克隆过滤器。 需要 --filter--recurse-submodules 。这可以通过设置 clone.filterSubmodules 配置项来默认开启。

--mirror

建立源存储库的镜像。这默认包含 --bare 选项。与 --bare 相比,--mirror 不仅将源的本地分支映射到目标的本地分支,还映射所有引用(包括远程跟踪分支,注释等)并设置了引用规范,因而在目标仓库中执行 git remote update 时,所有这些引用都会被覆盖。

-o <名称>
--origin <名称>

不使用远程名称 origin 来跟踪远程仓库,而使用 <name> 值。 这会覆盖配置中 clone.defaultRemoteName 的设置。

-b <名称>
--branch <分支名>

不将新创建的 HEAD 指向克隆仓库的 HEAD 所指向的分支,而是指向 <分支名> 分支。在非裸仓库中,这是将被检出的分支。 --branch 也可以使用标签并在生成的仓库中的提交时分离 HEAD。

-u <上传包>
--upload-pack <upload-pack>

如果指定了要克隆的仓库,且可以通过 ssh 访问该仓库,这将为另一端运行的命令指定非默认路径。

--template=<模板目录>

指定将使用模板的目录;(请参阅 git-init[1] 的 “模板目录” 部分。)

-c <键>=<值>
--config <键>=<值>

在新创建的仓库中设置配置变量;这将在初始化仓库之后、获取远程历史记录或签出任何文件之前立即生效。密钥的格式与 git-config[1] 期望的格式相同(例如,core.eol = true)。如果为同一键指定了多个值,则每个值都将写入配置文件。例如,这可以安全地将其他抓取引用规则添加到源远程仓库。

由于当前实现方式的限制,某些配置变量要等到初始获取和签出后才能生效。已知不会生效的配置变量有:remote.<名称> .mirrorremote.<名称> .tagOpt。如要修改,应改用相应的 --mirror--no-tags 选项。

--depth <深度>

创建一个历史记录被截断为指定提交次数的 ‘浅’ 克隆。暗含 --single-branch 选项,除非给出 --no-single-branch 来获取所有分支顶端附近的历史记录。如果要浅层克隆子模块,还可以使用 --shallow-submodules 选项。

--shallow-since=<日期>

创建浅克隆,只包含指定的时间之后的历史记录。

--shallow-exclude=<修订版本>

创建一个有历史的浅克隆,不包含可以被指定远程分支或标签访问的提交。本选项可以使用多次。

--[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[=<路径规范>]

创建克隆后,根据提供的路径规范初始化并克隆其中的子模块。如果未提供路径规范,则将初始化并克隆所有子模块。对于由多个条目组成的路径规范,可以多次赋予此选项。生成的克隆将把 submodule.active 设为提供的路径规范。如果未提供路径规范,生成的克隆将把 submodule.active 设为 "." (表示所有子模块)。

子模块使用其默认设置进行初始化和克隆。这等效于克隆完成后立即运行 git submodule update --init --recursive <路径规范>。如果克隆的仓库没有工作区/检出(即给出了 --no-checkout/-n--bare 或 `--mirror`中的任何一个选项),则忽略此选项

--[no-]shallow-submodules

所有克隆的子模块都将是浅克隆,深度为 1。

--[no-]remote-submodules

克隆的所有子模块将使用子模块的远程跟踪分支的状态来更新子模块,而不是超级项目的已记录 SHA-1。等同于将 --remote 传递给 git submodule update

--separate-git-dir=<Git 目录>

不将克隆的仓库放置在原处,而是将克隆的仓库放置在指定的目录中,然后在此处建立与文件系统无关的 Git 符号链接。这可以将 Git 仓库与工作区分离。

--ref-format=<引用格式>

指定存储库的给定引用存储格式。有效值为:

Warning

Missing zh_HANS-CN/ref-storage-format.txt

See original version for this content.

-j <n>
--jobs <n>

同时抓取的子模块数。默认为 submodule.fetchJobs 选项。

<仓库>

要克隆的(可能是远程的)仓库。有关指定仓库的更多信息,参阅下面的 GIT 地址 部分。

<目录>

要克隆到的新目录的名称。如果未明确指定目录,则使用源仓库中的 “人性化” 部分(对于 /path/to/repo.git 而言,为 repo;对于 host.xz:foo/.git 而言,为 foo )。仅当目录为空时才允许克隆到现有目录。

--bundle-uri=<uri>

在从远程获取之前,从给定的 <uri> 中获取一个捆绑包,并将数据解绑到本地仓库中。捆绑包中的引用将被存储在隐藏的 refs/bundle/* 命名空间下。该选项不与 --depth--shallow-since--shallow-exclude 兼容。

GIT 地址

通常,地址包含有关传输协议,远程服务器的地址以及仓库路径的信息。对于某些传输协议,一些信息可能会缺失。

Git 支持 ssh,git,http 和 https 协议(此外,可以使用 ftp 和 ftps 进行抓取,但这效率低下且不建议使用;请勿使用)。

本地传输(即 git:// URL)不进行身份验证,在不安全的网络上应谨慎使用。

以下是上述几个传输协议的格式:

  • ssh://[user@]host.xz[:port]/path/to/repo.git/

  • git://host.xz[:port]/path/to/repo.git/

  • http[s]://host.xz[:port]/path/to/repo.git/

  • ftp[s]://host.xz[:port]/path/to/repo.git/

ssh 协议也可以使用类似 scp 的语法:

  • [user@]host.xz:path/to/repo.git/

仅当第一个冒号之前没有斜杠时才能识别此语法。这有助于区分包含冒号的本地路径。例如,可以将本地路径 foo:bar 指定为绝对路径,或者将 ./foo:bar 指定为绝对路径,以避免被误识别为 ssh url。

ssh 和 git 协议还支持 ~username 扩展:

  • ssh://[user@]host.xz[:port]/~[user]/path/to/repo.git/

  • git://host.xz[:port]/~[user]/path/to/repo.git/

  • [user@]host.xz:/~[user]/path/to/repo.git/

对于本地仓库(Git 本身也支持),可以使用以下语法:

  • /path/to/repo.git/

  • file:///path/to/repo.git/

这两种语法几乎是等效的,除了前者暗含 --local 选项。

git clonegit fetchgit pull(但不包括 git push)也会接受合适的捆绑包文件。参见 git-bundle[1]

当 Git 不知道如何处理某种传输协议时,它会尝试使用 remote-<传输方式> 远程帮助程序(如果存在)。要显式请求远程帮助程序,可以使用以下语法:

  • <传送>::<地址>

其中,<地址> 可以是路径,服务器与路径,也可以是可被调用的特定远程帮助程序识别的类似于网页地址的任意字符串。有关详细信息,请参阅 gitremote-helpers[7]

如果存在大量类似名称的远程仓库,并且您要为其使用不同的格式(这样,您使用的地址将被重写为有效的地址),则可以创建以下形式的配置:

	[url "<实际基础网址>"]
		insteadOf = <其他基础网址>

例如,有如下:

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

诸如 "work:repo.git" 或 "host.xz:/path/to/repo.git" 的地址会在任何类似于 "git://git.host.xz/repo" 地址的上下文中重写。

如果要重写仅用于推送的地址,可以创建表单的配置部分:

	[url "<实际基础网址>"]
		pushInsteadOf = <其他基础网址>

例如,有如下:

	[url "ssh://example.org/"]
		pushInsteadOf = git://example.org/

类似于 "git://example.org/path/to/repo.git" 的地址会被重写为 "ssh://example.org/path/to/repo.git",用于推送。但拉取代码时仍然使用原始的地址。

实例

  • 从上游仓库克隆:

    $ 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

配置

Warning

Missing zh_HANS-CN/includes/cmd-config-section-all.txt

See original version for this content.

Warning

Missing zh_HANS-CN/config/init.txt

See original version for this content.

Warning

Missing zh_HANS-CN/config/clone.txt

See original version for this content.

GIT

属于 git[1] 文档

scroll-to-top