你将如何使用DVCS(在我的情况下是mercurial)来开发不同版本的.NET框架?

kit*_*une 8 .net asp.net version-control mercurial dvcs

我正在为我们的cms(在asp.net webforms上运行)编写某种新的管理仪表板.我们的一些旧服务器只能出于各种原因处理.NET 2.0,所以我必须重写我使用lambda表达式等的代码.

我想知道如何使用像mercurial这样的dvcs同时开发这两个版本.

我目前的代码库和mercurial存储库是针对.NET 3.5的.我对mercurial相对较新,我想我必须分支代码库?

任何最佳实践或教程?

Mar*_*ler 13

是的,你可以使用Mercurial.以下是它的工作原理.

假设您调用当前的克隆,new-dot-net因为它支持新的.Net版本.你复制它并调用它 old-dot-net或类似的东西.这两个克隆现在相同,都是.Net 3.5.

现在仔细进行小的更改,old-dot-net以使.Net 2.0兼容.当您进行更改时,两个克隆将开始分歧:

new-dot-net: ... [a] --- [b]

old-dot-net: ... [a] --- [b] --- [c] --- [d]

在这里,您可以创建[c][d]更改集以添加.Net 2.0兼容性.请注意old-dot-net克隆如何包含更多变更集,new-dot-net因为它具有您希望看到的向后兼容性更改new-dot-net.在您继续工作时,重要的是要考虑到这一点:net-dot-net将包含更改集的子集old-dot-net.的变化从流动 new-dot-netold-dot-net,但从来没有在相反方向上.

假设你做了一个新的改变new-dot-net.您进行了更改,new-dot-net现在情况如下:

new-dot-net: ... [a] --- [b] --- [x]

old-dot-net: ... [a] --- [b] --- [c] --- [d]

您现在想要将更改后端移植到old-dot-net您,您可以更改为old-dot-net以及从中拉出net-dot-net:

% cd old-dot-net
% hg pull ../new-dot-net
Run Code Online (Sandbox Code Playgroud)

这将创建一个新的头old-dot-net:

                             [x]
                            /
old-dot-net: ... [a] --- [b] --- [c] --- [d]

因为[x]变更集具有[b]父变更集.你现在有多个头,必须合并以减少头数.通过合并,您可以创建一个新的变更集,这是您说"这是如何[x][d]应该结合"的方式.如果[x] 变更只会接触代码是不是也感动于[c][d],则合并应该只是工作.否则,您将看到合并工具并且必须解决冲突.您将合并提交为chageset [e]:

                             [x] --------------.
                            /                   \
old-dot-net: ... [a] --- [b] --- [c] --- [d] --- [e]

而且您已经完成了 - 您现在已将[x]更改合并到.Net 2.0兼容代码中.

每当有变化时你都会重复这个new-dot-net.假设添加了更多功能:

new-dot-net: ... [a] --- [b] --- [x] --- [y] --- [z]

把它们拉进old-dot-net你后得到

                             [x] --------------.---- [y] --- [z]
                            /                   \
old-dot-net: ... [a] --- [b] --- [c] --- [d] --- [e]

你现在合并[e][z]:

                             [x] --------------.---- [y] --- [z]
                            /                   \               \
old-dot-net: ... [a] --- [b] --- [c] --- [d] --- [e] ----------- [f]

要记住的重要部分是:

  • 做任何新的功能new-dot-net.
  • 变成了old-dot-net
  • 从不强迫old-dot-netnew-dot-net.

如果您在某些时候发现new-dot-net不需要更改old-dot-net,那么您仍然需要将其拉入并合并它.但是你会做一个虚拟合并.如果磁头[w][g],并且要保留[g],然后做

% HGMERGE=true hg merge -y
% hg revert --all --rev g
% hg commit -m 'Dummy merge with y.'
Run Code Online (Sandbox Code Playgroud)

诀窍是做合并,而无需关心结果,然后恢复所有的变更,并提交不变的工作副本合并.这样,你告诉全世界"的组合[w],并 [g][g]",也就是说,你扔掉的变化[w].在取得了新的变化new-dot-net后,[w]然后可以合并正常人一样.