git clone --branch
命令,我们只会复制指定的分支。那么额外的 --single-branch
参数是用来做什么的?文档对我来说并不清楚。TIA
git clone --branch
命令,我们只会复制指定的分支。那么额外的 --single-branch
参数是用来做什么的?文档对我来说并不清楚。--branch foo
会在克隆完成后自动检出 foo
分支,但是该克隆会下载所有分支/标签及其可达数据。
--branch foo --single-branch
告诉 git-clone 只下载从 foo
可达的数据并检出 foo
分支。
git clone --branch
命令,那么我们只会复制指定的分支。git clone --branch name url
(我的意思是)大致相当于:
(git clone url && cd clone-target-directory && git checkout name)
即它执行了完整的克隆。上面的括号是因为您的主命令解释器不会更改目录,因此为了模拟这一点,我们需要在子shell中执行cd
。
git clone
命令本身是一系列更原始的Git操作的简写。所有操作都在一个新目录中完成1,我将其显示为步骤1,但请注意,您的命令解释器本身留在这个新目录之外,因此您最终需要自己单独执行cd
进入新目录。有些选项是不兼容的或设置其他选项,例如使用--depth
默认设置--single-branch
2。这些内置到一个单独的命令中,而不是实际上让git clone
调用每个单独的Git命令,但是假设整个克隆成功,则效果与手动运行每个命令相同3。
mkdir 目标文件夹名称 && cd 目标文件夹名称
。目标文件夹是由您指定或从给git clone
的URL自动计算得出的。请参见注脚1。
git init
,用于创建新的空仓库。
如果您使用了--bare
或--mirror
参数,则git clone
将把该仓库配置为裸克隆或镜像克隆,就好像运行了git init --bare
一样。
git remote add origin url
,使名称origin
标识您在git clone
中提供的url
参数。
您也可以让git clone
进行其他配置;请查看-c
/--config
选项。
如果您使用了-o
或--origin
参数,则可以将名称从origin
更改为任何其他名称。本文假定您未使用该参数。
如果您使用了参数--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
配合使用。)
git fetch origin
:此步骤实际上会连接到位于url
处的其他Git,从中获取引用列表(分支和标记名称等),以获取要传输的最新提交清单。传输的提交因第4步设置的remote.origin.fetch
设置(如果有)或第3步设置的默认设置而异。
最后,只要这不是一个裸克隆(既非--bare
也非--mirror
),就运行git checkout 分支名称
。对git checkout
的参数选择来自以下列表的最佳匹配项:4
-b
/--branch
中提供的参数master
此git checkout
命令实际上使用与复制的远程跟踪名称相同的提交创建本地分支。例如,如果您说要检出-b xyz
,
-b
和--single-branch
都允许您选择自己的分支名称,但它们在git clone
运行步骤序列的早期阶段产生了不同的影响。
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"功能时,无需猜测。