【问题标题】:How do fetch remote branch after I cloned repo with git clone --depth 1使用 git clone --depth 1 克隆 repo 后如何获取远程分支
【发布时间】:2018-03-30 07:14:52
【问题描述】:

我的回购历史悠久,所以我使用克隆

git clone <url> --depth 1

现在我在 master 分支中。

如何获取之前分支 3 次提交的名为“feature/my-feature”的远程分支?

我试过了:

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

git fetch -all

但我仍然只看到 master 分支

【问题讨论】:

标签: git


【解决方案1】:

TL;DR

您需要:

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 initgit remote addgit fetchgit checkout 在内的一长串Git 命令。可能还会使用更多命令,如有必要。)

特别是--depth 1有添加--single-branch的副作用。如果你没有用明确的--no-single-branch 取消它,Git 将配置fetch 行,就像你已经运行了一样:

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

这告诉以后git fetch 命令 引入给定的&lt;branch&gt;,而不引入其他命令。

普通(非浅层、非单分支)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 将根据需要创建新的浅截止以将深度设置为您指定的数字,或者将任何现有的浅截止增加您指定的号码。如果有多个分支,它们的各个cut-offs之间的关系是复杂的(都是基于graph walk,没有代码检查或测试,很难说Git在一些棘手的情况下会如何表现)。

【讨论】:

  • 终于有答案了!这应该是公认的。感谢您对它的解释比其他讨论要好得多。
【解决方案2】:

您可以尝试通过指定获取深度来强制它:

git fetch --depth=999999

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

如果需要,将这个数字变大!

编辑

您也可以/可能应该使用 deep - 相同的语法,但它有效地从您上次指定深度停止的位置获取......所以它更有效:

git fetch --deepen=999999

这可能取决于你的 git 版本,但最后一个....

编辑 2

我在查看 git 文档时看到了这个......

git fetch --unshallow

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

【讨论】:

    猜你喜欢
    • 2014-07-05
    • 1970-01-01
    • 2022-10-07
    • 2012-10-07
    • 2015-05-29
    • 2020-03-01
    • 2016-05-02
    • 2020-12-11
    相关资源
    最近更新 更多