我的目标是能够构建具有悠久历史的项目的最新版本并为该项目做出贡献 - 并且在不使用本地存储复制许多历史分支和十多年前的历史的情况下做到这一点(无论如何,如果我需要,我总是可以在项目中央存储库的 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 能够自动执行的操作,但我还没有找到方法。手动的,挺麻烦的。:)