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

时间:2018-02-19 14:35:14

标签: git

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

TIA

3 个答案:

答案 0 :(得分:5)

克隆完成后,

--branch foo会自动检出foo,但克隆会下载所有分支/标记及其可访问数据。

--branch foo --single-branch告诉git-clone只下载foo可以访问的数据并查看foo

答案 1 :(得分:4)

  

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

不,您正在克隆整个存储库并检查该分支。

答案 2 :(得分:0)

作为ElpieKay answeredgit clone --branch name url(我的意译)非常等同于:

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

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

git clone命令本身是一系列更原始的Git操作的简写。所有这些都在一个新目录 1 中完成,我将在此处显示为步骤1,但请注意,您的命令解释程序本身仍在此新目录之外,因此您最终必须单独执行cd进入新目录。某些选项不兼容或设置其他选项,例如,默认情况下使用--depth--single-branch 2 这些选项内置于单个命令中,而不是实际具有{{1调用每个单独的Git命令,但假设整个克隆成功,效果与手动运行每个命令的效果相同。 3

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

  2. git clone,用于创建新的空存储库。

    如果您使用git init--bare标记,--mirror会将存储库配置为裸克隆或镜像克隆,就像运行git clone一样。< / p>

  3. git init --bare,以便名称git remote add origin url标识您提供给origin url 参数。

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

    如果您使用--config-o标记,则可以将名称--origin更改为您喜欢的任何其他名称。其余的假设你没有。

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

    在任何一种情况下,在引入每个分支提示提交(以及从这些提示可以访问的所有提交)之后,您的Git 重命名从其他Git获取的分支,以便代替实际的分支名称,这些成为远程跟踪名称:git remote add

    如果您在refs/remotes/origin/whatever期间使用--mirror选项,Git会覆盖所有这些选项并将fetch refspec设置为git clone。 (我不清楚+refs/*:refs/*应该如何与--mirror互动。)

  5. --single-branch:此步骤实际上与 git fetch origin 中的其他Git联系,并从中获取引用列表(分支和标记名称,等等)获取提交提交的列表。提交的提交取决于步骤4中设置的url设置(如果有)或步骤3中的默认设置。

  6. 最后,只要这不是裸克隆(remote.origin.fetch--bare),--mirrorgit checkout branch步骤的参数从此列表中的最佳匹配中选择: 4

    • 您向git checkout / -b
    • 提出的论点
    • 其他Git推荐的分支名称
    • --branch

    master命令实际创建您的本地分支,使用复制的远程跟踪名称标识的相同提交。例如,如果您说要结帐git checkout,则您的-b xyz会将其git fetch带回来,并将其重命名为refs/heads/xyz。然后,此refs/remotes/origin/xyz会创建您自己的git checkout,指向与您的refs/heads/xyz相同的提交,这当然指向他们的 Git的提交(或已拥有) )作为他们的refs/remotes/origin/xyz

    (如果您使用refs/heads/xyz选项命名标记,则Git会在您自己的存储库中创建 no 分支。)

  7. 因此,虽然-b-b都允许您选择自己的分支名称,但它们在--single-branch的步骤序列中具有不同的早期效果运行。

    1 当您运行git clone告诉git clone url directory将克隆放入给定但现有目录时,会出现此规则的例外情况,例如,git clone。为了让Git允许这个,给定的目录必须为空。

    2 如果您使用.(即使它只是暗示),Git将克隆您使用git clone --single-branch / {{1}指定的特定分支}。如果您没有选择使用此选项,Git将使用步骤6中显示的方法为您选择一个。

    3 如果-b操作失败,Git将自行清理,删除整个新目录或在空目录中创建的所有内容。< / p>

    4 为了选择正确的分支,你的Git必须向另一个Git询问它的--branch是什么。在1.8.5之前的Git版本中,没有办法找到答案。如果参与克隆过程的Git早于1.8.5,那么您的Git将拥有其他Git列表的所有分支名称及其哈希ID,然后列出与其git clone一起使用的哈希ID猜测可能是哪个分支。如果两个Gits都至少为1.8.5,那么你的Git只会让他们的Git向你发送他们推荐的分支名称 - 当两个Gits都支持&#34;读取符号HEAD&#34;时,不需要猜测。能力。