我正在尝试在OpenSSH(Roumen Petrov's X.509v3 implementation)上添加社区维护补丁以及我们自己的补丁。据我所知,这不适合常规解决方案,因为这个补丁非常庞大,而且这个补丁的所有版本都与OpenSSH的特定上游版本绑定在一起。 OpenSSH在补丁版本之上的明显升级是一个简单的合并冲突,正是我想要避免的,但在Git中保持上游和修补版本不同。
现在,我已经使用分支在Git中完成了这个:
master
gert/develop
vendor/orig
vendor/roumenpetrov
使用
vendor/orig
是一个简单的,原始的OpenSSH代码分支,每个提交一个OpenSSH发行版本,也被标记,例如5.9p1
vendor/roumenpetrov
是来自vendor/orig
的分支,其中应用了相应的补丁,也标记了,例如5.9p1+x509-7.1
gert/develop
是“每日开发”分支,基于vendor/roumenpetrov
,现在只有一些本地影响较小的提交。master
是发布就绪代码的分支我的目标基本上是这样的:
master
已经在6.0p1了吗?” - &GT; git branch --contains <commit-of-openssh-6.0p1>
是/否答案。实际上我的上述模型存在问题。假设我想要从Roumen升级到6.0p1以及相应的新7.4补丁。我该怎么办?我找到了以下选项:
升级,还原,升级,合并
vendor/orig
中,升级OpenSSH版本。vendor/roumenpetrov
中,还原先前的提交(git revert 12345678
,7.1补丁)。vendor/roumenpetrov
中,与vendor/orig
合并。vendor/roumenpetrov
中,应用新的修补程序并提交。gert/develop
中,与vendor/roumenpetrov
问题:1)要采取的措施很多,2)恢复操作是一个单独的提交,在阅读日志时会引起混淆(“6.0p1发布” - &gt;“恢复X509 7.1” - &gt;“合并供应商/ orig “ - &gt;”应用X509 7.4“。),3)使用后续重新修补操作的恢复可能会导致超过理想的冲突概率,对吗?
正面:git log vendor/orig..vendor/roumenpetrov
向我展示了实际的变化,尽管列出了四次提交。
相同,但--no-commit
vendor/roumenpetrov
:git revert -n <patch-7.1>
vendor/roumenpetrov
:git cherry-pick -n <openssh-6.0p1>
vendor/roumenpetrov
:git commit
中,将此识别为与来自邮件的提交相同。问题:git log vendor/roumenpetrov..vendor/orig
显示openssh-6.0p1未应用,因为它有不同的提交哈希值(diff = empty)。
合并--squash
问题:与上述相同,但出于其他原因。
底垫
问题:我们将此存储库推送到中央(尚未公开)的位置。因此,如果其他人也在这个分支上工作,那么在新vendor/roumenpetrov
的{{1}}分支中重新定位是不可取的。这也适用于其他远程分支。请参阅this answer,了解为什么我认为变基不是我的选择。
而且svnpenn mentions是什么?
没有rebase,除了做丑陋的合并提交之外别无选择。
所以,退后一步,我最好的选择是什么才能保持这种可维护性?根据特定的OpenSSH版本,我是否必须为Roumen补丁的不可避免的原因做出牺牲?我是否需要修改整个分支模型?或者我错过了一些非常基本的东西?
答案 0 :(得分:1)
OpenSSH在补丁版本之上的明显升级是简单合并 冲突和我想要避免的,但保持上游和修补 版本与Git不同。
我处理这个问题的方法是将更改保存在单独的分支上
A--B--C
\
X--Y--Z
然后如果提交上游
A--B--C--D--E--F
\
X--Y--Z
您可以将分支重新绑定到新的HEAD
A--B--C--D--E--F
\
X'--Y'--Z'
这可以避免合并提交,并且如果upstream
人决定这样做,将很容易合并到master中。