【发布时间】:2023-03-05 20:22:01
【问题描述】:
在使用 git clone -b <branch-name> <repo-name> 之前,我已经克隆了一个 repo 的单个分支,但最近看到 git clone --single-branch -b <branch-name> <repo-name> 被使用。
有什么区别?
【问题讨论】:
标签: git git-branch git-clone
在使用 git clone -b <branch-name> <repo-name> 之前,我已经克隆了一个 repo 的单个分支,但最近看到 git clone --single-branch -b <branch-name> <repo-name> 被使用。
有什么区别?
【问题讨论】:
标签: git git-branch git-clone
您使用的命令 (git clone -b <branch-name> <repo-name>) 会克隆整个 repo。 -b 选项在这里所做的唯一事情就是更改最初签出的内容。
--single-branch 更新默认 refspec,以便仅下载指定分支的历史记录(和相关数据)。
【讨论】:
扩展一点 Mark Adelsberger 的回答(我已经赞成):请注意 git clone 实际上意味着:
创建一个新的全空目录,或者如果指示,接管现有的全空目录:
git clone https://github.com/git/git
将创建新目录git 来保存新的 Git 存储库。输入此目录以完成其余步骤;但是你的命令行解释器不在新目录中,所以克隆完成后,你必须自己进入新目录。
在这个空目录中运行git init,这样它现在就有一个.git 子目录来保存一个Git 存储库。新的 Git 存储库完全是空的(没有提交、没有分支等,尽管您在不存在的 master 分支上)。
运行git remote add origin <em>url</em>。例如,对于上述情况,Git 会添加一个名为 origin 的远程,告诉 Git 连接到 https://github.com/git/git。
还需要运行任何额外的各种git config 命令。
运行git fetch origin。
为一些名为branch的人运行git checkout <em>branch</em>。
如果您愿意,您可以手动运行这六个步骤,但git clone 更容易。
现在您知道这六个步骤是什么,很容易解释 -b 参数和 --single-branch 参数:
-b <em>branch</em> 在第 6 步中选择要传递给 git checkout 的参数。如果您不自己选择分支名称,您的 Git 将获得 他们的 Git 的推荐,在第 5 步中,并将使用该名称。
--single-branch 将git config 命令添加到第 4 步。特别是,它更改了remote.origin.fetch 设置。
git remote add 步骤将/将设置 remote.origin.fetch 为 +refs/heads/*:refs/remotes/origin/*,这是对 git fetch 命令的指令(参见步骤 5)以获取 all 分支并重命名所有将它们发送到您的origin/* 远程跟踪名称。
使用--single-branch,git clone 会覆盖默认值。这个 refspec 对的左侧不是+refs/heads/*,而是+refs/heads/<em>branch</em>。因此右侧是+refs/remotes/origin/<em>branch</em>,因此您的最终remote.origin.fetch 设置为:
+refs/heads/<branch>:refs/remotes/origin/<branch>
指示第 5 步中的git fetch,以及所有未来的git fetch 操作,仅更新您的origin/<em>branch</em> 远程跟踪名称。
请注意,如果您没有事先专门选择某个分支,git clone 将使用其他 Git 在第 5 步中推荐的任何分支,以达到第 4 步的配置结果。这意味着实际上这些步骤并不完全按顺序排列:git clone 只是在内部最方便的地方执行每个部分。如果您出于某种原因想要手动执行此操作,则需要按此顺序执行六个步骤。 (不过,您可以使用 git remote add 和 -t 选项来组合步骤 3 和 4,只要由于其他 git clone 选项而不需要任何其他特殊配置选项。)
【讨论】: