git clone中--single-branch参数的目的是什么?

8
如果我们使用 git clone --branch 命令,我们只会复制指定的分支。那么额外的 --single-branch 参数是用来做什么的?文档对我来说并不清楚。
TIA

请点击此处查看 https://dev59.com/tm445IYBdhLWcg3wia2V#14930421 - MAhipal Singh
注意:现在(Git 2.26,2020年第一季度)它也适用于子模块。请参见如何在Git中克隆单个分支?的最后一节。 - VonC
3个回答

15

--branch foo 会在克隆完成后自动检出 foo 分支,但是该克隆会下载所有分支/标签及其可达数据。

--branch foo --single-branch 告诉 git-clone 只下载从 foo 可达的数据并检出 foo 分支。


7
如果我们使用git clone --branch命令,那么我们只会复制指定的分支。
不,您将克隆整个仓库并检出该分支。

6
ElpieKay所回答的那样,git clone --branch name url(我的意思是)大致相当于: (git clone url && cd clone-target-directory && git checkout name) 即它执行了完整的克隆。上面的括号是因为您的主命令解释器不会更改目录,因此为了模拟这一点,我们需要在子shell中执行cdgit clone命令本身是一系列更原始的Git操作的简写。所有操作都在一个新目录中完成1,我将其显示为步骤1,但请注意,您的命令解释器本身留在这个新目录之外,因此您最终需要自己单独执行cd进入新目录。有些选项是不兼容的或设置其他选项,例如使用--depth默认设置--single-branch2。这些内置到一个单独的命令中,而不是实际上让git clone调用每个单独的Git命令,但是假设整个克隆成功,则效果与手动运行每个命令相同3
  1. mkdir 目标文件夹名称 && cd 目标文件夹名称。目标文件夹是由您指定或从给git clone的URL自动计算得出的。请参见注脚1。

  2. git init,用于创建新的空仓库。

    如果您使用了--bare--mirror参数,则git clone将把该仓库配置为裸克隆或镜像克隆,就好像运行了git init --bare一样。

  3. git remote add origin url,使名称origin标识您在git clone中提供的url参数。

    您也可以让git clone进行其他配置;请查看-c/--config选项。

    如果您使用了-o--origin参数,则可以将名称origin更改为任何其他名称。本文假定您未使用该参数。

  4. 如果您使用了参数--single-branch,则运行以下命令:git config remote.origin.fetch +refs/heads/分支名称:refs/remotes/origin/分支名称。这将覆盖默认值,而默认情况下git remote add告诉Git:带上每个分支。而该设置会告诉Git:只带上指定的分支。详见注脚2。

    无论哪种情况,当传输每个分支的最新提交(以及从这些提交可到达的所有提交)后,您的Git都会对其从其他Git获取的分支进行重命名,以便它们不再是实际分支名称,而成为远程跟踪名称:refs/remotes/origin/任何内容

    如果您在执行git clone时使用了--mirror参数,则Git将覆盖所有这些设置,并将提取refspec设置为+refs/*:refs/*。(未明确说明如何将--single-branch--mirror配合使用。)

  5. git fetch origin:此步骤实际上会连接到位于url处的其他Git,从中获取引用列表(分支和标记名称等),以获取要传输的最新提交清单。传输的提交因第4步设置的remote.origin.fetch设置(如果有)或第3步设置的默认设置而异。

  6. 最后,只要这不是一个裸克隆(既非--bare也非--mirror),就运行git checkout 分支名称。对git checkout的参数选择来自以下列表的最佳匹配项:4

    • 您在-b/--branch中提供的参数
    • 其他Git推荐的分支名称
    • master

    git checkout命令实际上使用与复制的远程跟踪名称相同的提交创建本地分支。例如,如果您说要检出-b xyz

    因此,虽然-b--single-branch都允许您选择自己的分支名称,但它们在git clone运行步骤序列的早期阶段产生了不同的影响。
    1例外情况是当您运行git clone url directory时,告诉git clone将克隆存储库放入指定但已存在的目录中,例如.。为了使Git允许这样做,给定的目录必须为空。 2如果您使用git clone --single-branch(即使只是暗示),Git将克隆您使用-b/--branch指定的特定分支。如果您没有使用此选项选择分支,Git将为您选择一个分支,使用第6步中显示的方法。 3如果git clone操作失败,Git将进行清理,删除整个新目录或在空目录中创建的所有内容。 4为了选择正确的分支,您的Git必须询问其他Git的HEAD是什么。在Git版本1.8.5之前,无法找到此信息。如果克隆过程中涉及的任一Git版本早于1.8.5,则您的Git将列出所有分支名称及其哈希ID,然后列出与其HEAD相关联的哈希ID,并猜测可能是哪个分支。如果两个Git都至少为1.8.5,则您的Git将直接获取其Git向您发送的推荐分支名称-当两个Git都支持"读取符号HEAD"功能时,无需猜测。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接