我的仓库有很长的历史,所以我使用以下命令进行克隆:
git clone <url> --depth 1
现在我在主分支中。
如何获取之前三个提交分支的名为'feature/my-feature'的远程分支?
我尝试了:
git checkout -b feature/my-feature origin/feature/my-feature
和
git fetch -all
但我仍然只看到主分支
我的仓库有很长的历史,所以我使用以下命令进行克隆:
git clone <url> --depth 1
现在我在主分支中。
如何获取之前三个提交分支的名为'feature/my-feature'的远程分支?
我尝试了:
git checkout -b feature/my-feature origin/feature/my-feature
和
git fetch -all
但我仍然只看到主分支
您需要:
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 init
、git remote add
、git fetch
和 git 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 在某些棘手情况下的行为)。
git fetch --depth=999999
深度是提交次数的数量。请注意,当您进行克隆时,克隆实际上会执行提取操作,并且深度与提取中指定的深度相同。
如果需要,请将该数字增加!
编辑
此外,您可以/可能应该使用deepen-相同的语法,但它实际上从上次指定深度停止的地方提取..因此更有效率:
git fetch --deepen=999999
但对于最后一个问题,可能取决于您的git版本....
编辑2
当我正在审查git文档时,刚看到这个....
git fetch --unshallow
这可能是最好的方式(不确定它实现在哪个版本中,我也没有尝试过...但看起来像是要使用的东西)。
git clone
命令中加入--no-single-branch
怎么样? - Werner Henze