git-clone

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

名称

git-clone - 将存储库克隆到新目录中

概要

  1. git clone [--template=<template_directory>]
  2. [-l] [-s] [--no-hardlinks] [-q] [-n] [--bare] [--mirror]
  3. [-o <name>] [-b <name>] [-u <upload-pack>] [--reference <repository>]
  4. [--dissociate] [--separate-git-dir <git dir>]
  5. [--depth <depth>] [--[no-]single-branch] [--no-tags]
  6. [--recurse-submodules[=<pathspec>]] [--[no-]shallow-submodules]
  7. [--jobs <n>] [--] <repository> [<directory>]

描述

将存储库克隆到新创建的目录中,为克隆存储库中的每个分支创建远程跟踪分支(使用git branch -r可见),并创建并检出从克隆存储库的当前活动分支分叉的初始分支。

在克隆之后,没有参数的普通git fetch将更新所有远程跟踪分支,并且没有参数的git pull将另外将远程主分支合并到当前主分支中(如果有的话)(这在“ - ”时是不真实的 - -single-branch“给出;见下文)。

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

OPTIONS

  1. --local
  1. -l

当要克隆的存储库位于本地计算机上时,此标志会绕过正常的“Git感知”传输机制,并通过制作HEAD副本以及对象和refs目录下的所有内容来克隆存储库。 .git/objects/目录下的文件是硬链接的,以便在可能的情况下节省空间。

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

  1. --no-hardlinks

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

  1. --shared
  1. -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即可将源存储库中的所有对象复制到克隆存储库中的包中。

  1. --reference[-if-able] <repository>

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

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

  1. --dissociate

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

  1. --quiet
  1. -q

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

  1. --verbose
  1. -v

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

  1. --progress

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

  1. --no-checkout
  1. -n

克隆完成后不会检查HEAD。

  1. --bare

制作一个 Git存储库。也就是说,不是创建&lt;directory&gt;并将管理文件放在&lt;directory&gt;/.git中,而是将&lt;directory&gt;本身设为$GIT_DIR。这显然意味着-n,因为无处可查看工作树。此外,遥控器上的分支头直接复制到相应的本地分支头,而不将它们映射到refs/remotes/origin/。使用此选项时,既不会创建远程跟踪分支,也不会创建相关的配置变量。

  1. --mirror

设置源存储库的镜像。这意味着--bare。与--bare相比,--mirror不仅将源的本地分支映射到目标的本地分支,它还映射所有引用(包括远程跟踪分支,注释等)并设置refspec配置,以便所有这些引用被目标存储库中的git remote update覆盖。

  1. --origin <name>
  1. -o <name>

不使用远程名称origin来跟踪上游存储库,而是使用&lt;name&gt;

  1. --branch <name>
  1. -b <name>

而不是将新创建的HEAD指向克隆存储库的HEAD所指向的分支,而是指向&lt;name&gt;分支。在非裸存储库中,这是将要检出的分支。 --branch还可以在生成的存储库中的标记处获取标记并分离HEAD。

  1. --upload-pack <upload-pack>
  1. -u <upload-pack>

给定时,通过ssh访问要克隆的存储库,这将指定另一端运行的命令的非默认路径。

  1. --template=<template_directory>

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

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

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

由于当前实现的限制,一些配置变量在初始提取和检出之后才会生效。已知未生效的配置变量为:remote.&lt;name&gt;.mirrorremote.&lt;name&gt;.tagOpt。请改用相应的--mirror--no-tags选项。

  1. --depth <depth>

创建一个克隆,其历史记录被截断为指定的提交次数。除非--no-single-branch用于获取所有分支的提示附近的历史,否则意味着--single-branch。如果要浅层克隆子模块,也要传递--shallow-submodules

  1. --shallow-since=<date>

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

  1. --shallow-exclude=<revision>

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

  1. --[no-]single-branch

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

  1. --no-tags

不要克隆任何标签,并在配置中设置remote.&lt;remote&gt;.tagOpt=--no-tags,确保将来的git pullgit fetch操作不会跟随任何标签。后续显式标记提取仍然有效(参见 git-fetch [1] )。

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

  1. --recurse-submodules[=<pathspec]

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

子模块使用其默认设置进行初始化和克隆。这相当于克隆完成后立即运行git submodule update --init --recursive &lt;pathspec&gt;。如果克隆的存储库没有工作树/结帐(即,如果给出--no-checkout / -n--bare--mirror中的任何一个),则忽略此选项

  1. --[no-]shallow-submodules

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

  1. --separate-git-dir=<git dir>

不要将克隆的存储库放在应该位于的位置,而是将克隆的存储库放在指定的目录中,然后创建与文件系统无关的Git符号链接。结果是Git存储库可以与工作树分开。

  1. -j <n>
  1. --jobs <n>

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

  1. <repository>

要从中克隆的(可能是远程的)存储库。有关指定存储库的更多信息,请参见下面的 GIT URL 部分。

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

  • <运输> ::<地址>

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

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

  1. [url "<actual url base>"]
  2. insteadOf = <other url base>

例如,有了这个:

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

像“work:repo.git”这样的URL或类似“host.xz:/path/to/repo.git”的URL将在任何带有URL的上下文中被重写为“git://git.host.xz/repo” git的”。

如果要为仅推送重写URL,可以创建表单的配置部分:

  1. [url "<actual url base>"]
  2. pushInsteadOf = <other url base>

例如,有了这个:

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

像“git://example.org/path/to/repo.git”这样的网址将被重写为“ssh://example.org/path/to/repo.git”以进行推送,但是pull仍会使用原始网址。

例子

  • 从上游克隆:

    1. $ git clone git://git.kernel.org/pub/scm/.../linux.git my-linux
    2. $ cd my-linux
    3. $ make
  • 创建一个从当前目录借用的本地克隆,而不检查:

    1. $ git clone -l -s -n . ../copy
    2. $ cd ../copy
    3. $ git show-branch
  • 从现有本地目录借用时从上游克隆:

    1. $ git clone --reference /git/linux.git \
    2. git://git.kernel.org/pub/scm/.../linux.git \
    3. my-linux
    4. $ cd my-linux
  • 创建一个裸存储库以将更改发布到公共:

    1. $ git clone --bare -l /home/proj/.git /pub/scm/proj.git

GIT

部分 git [1] 套件