使用 git clone --depth 1 克隆 repo 后如何获取远程分支

Lie*_*ero 7 git

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

git clone <url> --depth 1
Run Code Online (Sandbox Code Playgroud)

现在我在主分支。

如何获取之前分支 3 个提交的名为“功能/我的功能”的远程分支?

我试过了:

git checkout -b feature/my-feature  origin/feature/my-feature
Run Code Online (Sandbox Code Playgroud)

git fetch -all
Run Code Online (Sandbox Code Playgroud)

但我仍然只看到 master 分支

tor*_*rek 12

TL; 博士

您需要:

git config --add remote.origin.fetch \
    +refs/heads/feature/my-feature:refs/remotes/origin/feature/myfeature
Run Code Online (Sandbox Code Playgroud)

或者:

git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'
Run Code Online (Sandbox Code Playgroud)

紧随其后的是:

git fetch
git fetch --depth=<number>
git fetch --deepen=<number>
git fetch --unshallow
Run Code Online (Sandbox Code Playgroud)

解释

当你做一个浅克隆时,Git 会调整件事:

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

(运行git clone的简写,因为它是,这样做的是包括Git命令的长序列git initgit remote addgit fetch,和git checkout。可以使用一些更多的命令,如果必要的话)。

特别是,--depth 1具有添加的副作用--single-branch。如果您还没有使用显式取消它--no-single-branch,Git 将配置该fetch行,就好像您已经运行:

git config remote.origin.fetch +refs/heads/<branch>:refs/remotes/origin/<branch>
Run Code Online (Sandbox Code Playgroud)

这告诉后面的git fetch命令带来给定的<branch>,而不是其他的。

正常(非浅层,非单分支)git clone使用默认设置:

git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'
Run Code Online (Sandbox Code Playgroud)

它告诉每个人稍后git fetch带来每个分支。

然后,将所有未来的fetch操作配置为单分支后,浅克隆使用您指定的 获取,--depth使用名为 的文件插入特殊的“移植”条目.git/shallow。这些会影响克隆的整体有用性(但在任何现代 Git 中影响较小);有关更多信息,请参阅使用 --depth 1 进行浅克隆、创建提交并再次拉取更新是否安全? 但是,在这里,请注意这不会保留--depth数字。它只是缩短了初始提取。未来获取的行为,尤其是那些使用不同引用名称的行为,很难由此预测。

如果您运行git fetch --unshallow,Git 将找到所有浅层截断点并重新获取此点之前的所有历史记录。然后 Git.git/shallow完全删除特殊文件,克隆的行为就像一个非浅层克隆。这与克隆是否表现得像--single-branch克隆无关。

如果您git fetch使用特定的--depthor运行--deepen,Git 将根据需要进行新的浅截断以将深度设置为您指定的数字,或者将任何现有的浅截断增加您指定的数字。如果有多个分支,它们各个截止点之间的关系是复杂的(都是基于图走走,没有代码检查或测试,很难说 Git 在一些棘手的情况下会如何表现)。