【发布时间】:2018-02-19 14:35:14
【问题描述】:
如果我们使用git clone --branch 命令,我们只会复制指定的分支。额外使用的--single-branch 参数是什么?我不清楚文档。
TIA
【问题讨论】:
-
注意:现在也可以使用子模块(Git 2.26,2020 年第一季度)。见How do I clone a single branch in Git?的最后一段
标签: git
如果我们使用git clone --branch 命令,我们只会复制指定的分支。额外使用的--single-branch 参数是什么?我不清楚文档。
TIA
【问题讨论】:
标签: git
--branch foo 会在克隆完成后自动检出foo,但克隆会下载所有分支/标签及其可访问的数据。
--branch foo --single-branch 告诉 git-clone 仅下载可从 foo 访问的数据并检查 foo。
【讨论】:
如果我们使用
git clone --branch命令,我们只会复制指定的分支。
不,您正在克隆整个存储库并签出该分支。
【讨论】:
作为ElpieKay answered,git clone --branch <em>name</em> <em>url</em>(我的解释)非常大致相当于:
(git clone <em>url</em> && cd <em>clone-target-directory</em> && git checkout <em>name</em>)
——也就是说,它会进行完整的克隆。 (上面的括号是因为你的主命令解释器没有改变目录,所以为了模拟这个,我们需要在子shell中做cd。)
git clone 命令本身是一系列更原始的 Git 操作的简写。所有都在一个新目录中完成,1 我将在此处作为步骤 1 显示,但请注意,您的命令解释器本身位于该新目录之外,因此您最终不得不自己单独处理 @987654326 @ 进入新目录。某些选项不兼容或设置了其他选项,例如,默认使用 --depth 设置 --single-branch。2 这些选项内置在单个命令中,而不是实际让 git clone 调用每个单独的 Git命令,但假设整个克隆成功,效果与手动运行这些命令相同。3
mkdir <em>target</em> && cd <em>target</em>。目标目录是您指定的目录,或者是根据您提供给git clone 的 URL 计算得出的目录。再次参见脚注 1。
git init,创建新的空存储库。
如果您使用--bare 或--mirror 标志,git clone 将在此处将存储库配置为裸克隆或镜像克隆,就像运行git init --bare 一样。
git remote add origin <em>url</em>,以便名称 origin 标识您提供给 git clone 的 url 参数。
您也可以在此处获取git clone 进行额外配置;请参阅-c / --config 选项。
如果您使用 -o 或 --origin 标志,您可以将 name 从 origin 更改为您喜欢的任何其他名称。其余的假设你没有。
如果您使用--single-branch 标志,git config remote.origin.fetch +refs/heads/<em>branch</em>:refs/remotes/origin/<em>branch</em>。这会覆盖 git remote add 创建的默认值。默认设置告诉 Git:引入每个分支。这个特定设置告诉 Git:只引入一个命名的分支。参见脚注 2。
在任何一种情况下,在提交每个分支提示提交(以及从这些提示可访问的所有提交)之后,您的 Git 重命名它从另一个 Git 获得的分支,以便代替实际的分支名称,这些成为远程跟踪名称:refs/remotes/origin/<em>whatever</em>。
如果您在 git clone 期间使用 --mirror 选项,Git 将覆盖所有这些并将 fetch refspec 设置为 +refs/*:refs/*。 (不清楚--mirror 应该如何与--single-branch 交互。)
git fetch origin:这一步实际上联系了另一个 Git——在 url 的那个——并从中获取引用列表(分支和标签名称等)获取提示提交列表。带来的提交取决于步骤 4 中设置的 remote.origin.fetch 设置(如果有)或步骤 3 中设置的默认设置。
最后,只要这不是裸克隆(--bare 和 --mirror 都不是),git checkout <em>branch</em>。 git checkout 步骤的参数是从此列表中的最佳匹配中选择的:4
-b/--branch的参数
master这个git checkout 命令实际上创建您的本地分支,使用复制的远程跟踪名称标识的相同提交。例如,如果您说要签出-b xyz,您的git fetch 将带入他们的refs/heads/xyz 并将其重命名为您的refs/remotes/origin/xyz。这个git checkout 然后创建您自己的refs/heads/xyz,指向与您的refs/remotes/origin/xyz 相同的提交,这当然指向他们的 Git 已经(或已经)作为他们的refs/heads/xyz 的提交.
(如果您使用 -b 选项命名标签,您的 Git 会在您自己的存储库中创建 no 个分支。)
因此,虽然-b 和--single-branch 都允许您选择自己的分支名称,但它们在git clone 运行的步骤顺序中较早具有不同的效果。
1当您运行git clone <em>url</em> <em>directory</em> 告诉git clone 将克隆放入给定但现有 目录时,会出现此规则的例外情况,例如@987654381 @。为了让 Git 允许这样做,给定的目录必须是空的。
2如果您使用git clone --single-branch(即使它只是暗示),Git 将克隆您使用-b / --branch 指定的特定分支。如果您不使用此选项选择一个,Git 会使用步骤 6 中显示的方法为您选择一个。
3如果git clone 操作失败,Git 将自行清理,删除整个新目录,或在空目录中创建的所有内容。
4为了选择正确的分支,你的 Git 必须询问另一个 Git 它的 HEAD 是什么。在 1.8.5 之前的 Git 版本中,没有办法查到。如果参与克隆过程的任何一个 Git 早于 1.8.5,您的 Git 将让另一个 Git 列出其所有分支名称和它们的哈希 ID,然后列出与它们的 HEAD 一起使用的哈希 ID,并且 guess 可能是哪个分支。如果两个 Git 都至少是 1.8.5,您的 Git 只会让他们的 Git 向您发送他们推荐的分支名称——无需猜测两个 Git 何时支持“读取符号 HEAD”功能。
【讨论】: