8

我的目标是能够构建具有悠久历史的项目的最新版本并为该项目做出贡献 - 并且在不使用本地存储复制许多历史分支和十多年前的历史的情况下做到这一点(无论如何,如果我需要,我总是可以在项目中央存储库的 Web UI 中查找,我可能不会)。

我的第一次尝试似乎很幸运:

git clone --depth 40 -b master http://github.com/who/what.git/ what

这给了我一个只有 ' master' 分支的 'what' 的整洁本地克隆,并且有足够的提交来覆盖最近的两个标记版本。
然后我可以做' git checkout latest-release-tag'并构建最新版本。伊皮!

正如我所预料的那样,我需要做一个补丁。一切都很顺利:' git checkout -b my-patch-branch',进行更改,提交,我能够将 my-patch-branch 推回 github 上的克隆,以便项目可以拉取它。简单的!
我想我在那里很幸运,因为从我读到的内容来看,例如,在这里,在 git 1.9 之前我无法做到这一点。
但是安装的版本竟然是1.9,所以我侥幸成功了。

现在我想做的下一个明显的事情是从远程获取并获取 master 上的最新活动(包括我的补丁的上游合并,所以我不再需要那个分支)。我尝试了“git fetch --dry-run upstream”,惊恐地看着它下载了无穷无尽的兆字节,然后给了我一个可以追溯到乳齿象时代的新标签列表。我很高兴我说--dry-run

我真的希望它会master从我的克隆的 HEAD 开始在 ' ' 上接收十几个新的提交,然后也许我会有一个深度 52 的克隆而不是 40,但这就是我想要的......从我参与之前的大量近期历史开始,然后从那时开始跟踪和发展,并能够构建、分支和推送补丁。似乎如此接近。

有什么简单的方法可以让 git 做我想做的事情吗?我试图做的事情不合理吗?

编辑:更多信息。
(1) 上游实际上领先于我接近一百个提交,我估计的十几个提交被取消了。
(2) 结果证明,我使用克隆获得的原始 40 次提交都是单亲提交。我试图获取的后面的一堆是在我的克隆不包括的某个分支中与第二个父级合并提交。这些是否会因为我的克隆中最早的提交不是共同的祖先而导致 git 引入他们所有的古代历史?
有没有办法告诉它我不想要那个?

更多新信息:
(1)我突然想到我之前使用的是 http 协议,它实际上并没有与服务器上的 git 进程交互,因此它没有机会调整下载大小。
但是,当我重试使用 git-over-ssh 时,我仍然获得了巨大的收益。
然后
(2) 像动物一样手动点击 github 的“newtork”显示中显示的合并提交,找到涉及在我的浅切之前开始的分支的提交,并将它们的 parent-2 SHA 添加到我的.git/shallow文件中,然后尝试'git fetch' 再次通过 ssh。效果很好,下载了一个小包文件,可以快进我的本地master分支。我认为这正是我希望 git 能够自动执行的操作,但我还没有找到方法。手动的,挺麻烦的。:)

4

2 回答 2

3

我应该传递什么值?如果我最初在深度 40 克隆并且上游有 100 个新提交,我是否要求深度 140?

Git 2.11(2016 年第四季度)将允许您增加深度,因此如果您的 fetch 确实带来了 100 个新提交,您可以将新深度设置为 140

请参阅提交CCCF74E提交079AA97提交2997178提交CDC3727提交CDC3727提交859E5DF提交A45A260,提交269A7A8 ,提交41DA711 ,提交6D43A0C,提交6D43A0C ,提交994C2AA提交569E88888888888888commit 569E 39 emnd.49 emnd.49 emnd.4 emnd emnd4 ,,45a3e52提交 3f0f662提交 7fcbd37提交 6e414e3(2016 年 6 月 12 日) Nguyễn Thái Ngọc Duy ( pclouds)
帮助者:Duy Nguyen ( pclouds)Eric Sunshine ( sunshineco)Junio C Hamano ( gitster)
(由Junio C Hamano 合并 -- gitster--提交 a460ea4中,2016 年 10 月 10 日)

特别是,提交 cccf74e

fetch, upload-pack:通过提交--deepen=N扩展浅边界N

git fetch中,--depth参数始终与最新的远程参考相关。
这使得覆盖这个用例有点困难,用户想要制作浅层历史,比如更深 3 个级别。
如果远程引用尚未移动,它会起作用,但没有人能保证这一点,尤其是在最后一次克隆或“ git fetch --depth”之后几个月执行该用例时。
此外,使用 修改浅边界--depth不适用于由--since或创建的克隆--not

这个补丁解决了这个问题。无论远程引用在哪里,
一个新参数--deepen=<N>都会向当前历史记录添加更多 (*) 父提交。<N>

(*) 我们甚至可以支持否定的--deepen=<N>地方。 在这种情况下,我们可以从浅克隆中删除一些历史。此操作(和)不需要与远程端交互(因此实现起来更复杂)。<N>
--depth=<shorter depth>


在 Git 2.27(2020 年第二季度)之前,“ git pull”与底层“”共享许多选项git fetch,但其中一些没有记录在案,而一些有意义的传递也没有传递。

这意味着您可以在一个命令中加深您的回购历史并更新您当前的分支:

git pull --deepen=x

请参阅René Scharfe ( ) 的提交 13ac5ed提交 f05558f(2020 年 3 月 28 日(由Junio C Hamano 合并 -- --提交 9f471e4中,2020 年 4 月 22 日)rscharfe
gitster

pull: 传递记录的获取选项

报告人:天几
签字人:René Scharfe

提取选项--deepen, --negotiation-tip, --server-option, --shallow-exclude, 和--shallow-since也记录在案git pull,但实际上并未被该命令接受。

传递它们以使代码与其文档匹配。

于 2016-10-12T11:13:59.513 回答
0

也许你可以尝试 fetch + rename 分支。

例如,您已经克隆了一个 repo,--depth 1并且您希望将 master 分支更新为最新内容,但将其保留为浅拷贝。

# fetch newest master into master-tmp with --depth 1
git fetch --no-tags --depth 1 origin master:master-tmp

# switch to master-tmp
git checkout master-tmp

# force rename current branch (master-tmp) into master branch
git branch -M master
于 2021-12-03T10:45:17.413 回答