如何在使用git clone --depth 1克隆仓库后获取远程分支?

14

我的仓库有很长的历史,所以我使用以下命令进行克隆:

git clone <url> --depth 1

现在我在主分支中。

如何获取之前三个提交分支的名为'feature/my-feature'的远程分支?

我尝试了:

git checkout -b feature/my-feature  origin/feature/my-feature

git fetch -all

但我仍然只看到主分支


git clone 命令中加入 --no-single-branch 怎么样? - Werner Henze
被接受的答案不起作用,https://dev59.com/ebXna4cB1Zd3GeqPLn70#57335976 起作用。 - CodyChan
2个回答

20

简而言之

您需要:

git config --add remote.origin.fetch \
    +refs/heads/feature/my-feature:refs/remotes/origin/feature/myfeature

或:

git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'

随后跟任意以下内容之一:

git fetch
git fetch --depth=<number>
git fetch --deepen=<number>
git fetch --unshallow

解释

当你进行浅克隆时,Git会调整 两个 东西:

  • 要获取和更新的默认分支或标记集;以及
  • 初始获取的深度。

(运行 git clone 实际上是一个长序列的 Git 命令的简写,其中包括 git initgit remote addgit fetchgit checkout。如果需要,可能会使用更多的命令。)

特别地,--depth 1 的副作用是添加了 --single-branch。如果你不明确使用 --no-single-branch 来取消这一设置,Git 将配置 fetch 行,就像你已经运行了:

git config remote.origin.fetch +refs/heads/<branch>:refs/remotes/origin/<branch>

这将告诉后续的git fetch命令仅拉取给定的<branch>,而不是其他分支。

普通(非浅层、非单一分支)的git clone使用默认设置:

git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'

该命令会告知每一个后续的 git fetch 命令将获取所有分支的内容。

然后,配置好所有未来的 fetch 操作为单分支操作之后,使用指定的 --depth 进行浅克隆获取内容,这会在一个名为 .git/shallow 的文件中插入一些特殊的“嫁接”条目。这些条目影响克隆的整体实用性(但在任何现代的 Git 中都不会受到太大影响)。更多相关信息可参见 Is it safe to shallow clone with --depth 1, create commits, and pull updates again?。需要注意的是,这种方式不会保留 --depth 数值,它只是在初始获取时减少了数据量而已。对于未来的获取操作,特别是那些使用不同引用名称的获取操作,难以从此预测其行为。

如果你运行 git fetch --unshallow 命令,Git 将查找所有被截断的内容,并重新从此点开始获取所有历史记录。然后 Git 完全删除特殊的 .git/shallow 文件,克隆操作就能像非浅克隆一样进行。这与克隆操作是否使用 --single-branch 参数无关。

如果你运行带有特定 --depth--deepen 参数的 git fetch 命令,Git 将根据需要建立新的浅截断点以将获取数据深度设置为指定数值,或将现有的浅截断点向上增加指定数值。如果存在多个分支,则它们之间的各种截断点关系比较复杂(这完全基于图形遍历,没有代码检查或测试,很难预测 Git 在某些棘手情况下的行为)。


1
终于有答案了!这应该是被采纳的。谢谢您比其他讨论更好地解释了它。 - ParkerD

4
您可以尝试通过指定提取深度来强制执行此操作:
git fetch --depth=999999

深度是提交次数的数量。请注意,当您进行克隆时,克隆实际上会执行提取操作,并且深度与提取中指定的深度相同。

如果需要,请将该数字增加!

编辑

此外,您可以/可能应该使用deepen-相同的语法,但它实际上从上次指定深度停止的地方提取..因此更有效率:

git fetch --deepen=999999

但对于最后一个问题,可能取决于您的git版本....

编辑2

当我正在审查git文档时,刚看到这个....

git fetch --unshallow

这可能是最好的方式(不确定它实现在哪个版本中,我也没有尝试过...但看起来像是要使用的东西)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接