目的 - git clone中的单个分支?

Moh*_*man 1 git

如果我们使用该git clone --branch命令,我们只复制指定的分支.--single-branch使用的额外参数是什么?我不清楚文档.

TIA

Elp*_*Kay 7

--branch foofoo克隆完成后自动检出但克隆下载所有分支/标记及其可访问数据.

--branch foo --single-branch告诉git-clone只下载可以访问foo和检出的数据foo.


Cod*_*ter 6

如果我们使用该git clone --branch命令,我们只是复制指定的分支。

不,您要克隆整个存储库并检出该分支。


tor*_*rek 5

正如ElpieKay 回答的那样,(我的解释)大致相当于:git clone --branch name url

(git clone url && cd clone-target-directory && git checkout name)

——也就是说,它做了一个完整的克隆。(上面的括号是因为你的主命令解释器没有改变目录,所以为了模拟这一点,我们需要cd在一个子 shell 中做。)

git clone命令本身是短手一系列更原始GIT中操作。所有这些都在一个新目录中完成,1我将在此处作为第 1 步显示,但请注意,您的命令解释器本身位于这个新目录之外,因此您最终不得不将自己的内容单独cd放入新目录中。一些选项不兼容或设置其他选项,例如,默认使用--depth集合--single-branch2 这些内置于单个命令中,而不是实际git clone调用每个单独的 Git 命令,但假设整个克隆成功,效果与手动运行每个命令相同。3

  1. mkdir target && cd target. 目标目录是您指定的目录,或者是根据您提供给 的 URL 计算得出的目录git clone。再次参见脚注 1。

  2. git init, 创建新的空存储库。

    如果您使用--bare--mirror标志,git clone将在这里将存储库配置为裸克隆或镜像克隆,就像运行一样git init --bare

  3. git remote add origin url,以便名称origin标识url您提供给的参数git clone

    您也可以git clone在此处进行其他配置;请参阅-c/--config选项。

    如果使用-o--origin标志,您可以更改名称,从origin你喜欢的任何其他名称。其余部分假设您没有。

  4. 如果您使用该--single-branch标志,. 这将覆盖创建的默认值。默认设置告诉 Git:带来每个分支。 这个特殊的设置告诉 Git:只带一个命名的分支。 请参见此处的脚注 2。git config remote.origin.fetch +refs/heads/branch:refs/remotes/origin/branchgit remote add

    在任何一种情况下,在引入每个分支提示提交(以及从这些提示可访问的所有提交)之后,您的 Git重命名它从另一个 Git 获得的分支,以便这些分支名称不是实际的分支名称,而是远程跟踪名称:.refs/remotes/origin/whatever

    如果您在--mirror期间使用该选项git clone,Git 将覆盖所有这些并将 fetch refspec 设置为+refs/*:refs/*. (不清楚--mirror应该如何与--single-branch.)

  5. git fetch origin:这一步实际上联系了另一个 Git——那个urlat——并从中获取引用列表(分支和标签名称,等等)以获取要带来的提示提交列表。提交的提交取决于remote.origin.fetch步骤 4 中设置的设置(如果有)或步骤 3 中的默认设置。

  6. 最后,只要这不是一个裸露的克隆(既不--bare也不是--mirror), 。该步骤的参数是从这个列表中的最佳匹配中选择的:4git checkout branchgit checkout

    • 你给-b/的论点--branch
    • 其他 Git 推荐的分支名称
    • master

    git checkout命令实际上使用复制的远程跟踪名称标识的相同提交来创建您的本地分支。例如,如果您说要退房-b xyz,您git fetch将把他们refs/heads/xyzrefs/remotes/origin/xyz. 这git checkout然后创建你自己的refs/heads/xyz,指向同一个commit为你的refs/remotes/origin/xyz,它当然指向承诺是他们的Git有(或有)作为refs/heads/xyz

    (如果你用你的-b选项命名一个标签,你的 Git不会在你自己的存储库中创建分支。)

因此,虽然双方-b--single-branch允许您选择自己的分公司的名字,他们有不同的效果早期步骤,这些步骤的顺序git clone运行。


1当您运行告诉将克隆放入给定但存在的目录(例如. 为了让 Git 允许这样做,给定的目录必须为空。git clone url directorygit clone.

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,然后列出他们去散ID HEAD,并猜测哪个分支可能是。如果两个 Git 都至少是 1.8.5,你的 Git 只会让他们的 Git 向你发送他们推荐的分支名称——当两个 Git 都支持“读取符号 HEAD”功能时,无需猜测。