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