5

我想在Mercurial中存储一个包含来自Git和SVN存储库的外部代码(可由我修改)的项目。在SVN中,我会用vendor branches来解决这个问题,然后复制代码,但我知道在Mercurial it's better to have different repositories for different projects中,并在需要时将它们拉出来。来自外部储存库的Mercurial“供应商分支机构”?

项目布局将是这样的:

 
- externalLibraryA [comes from a SVN repo] 
    - ...with some extra files from me 
- externalLibraryB [comes from a SVN repo] 
    - ...with some extra files from me 
    - externalPluginForExternalLibraryB [comes from a Git repo] 

在Subversion中我会trunk创建vendor目录和trunk目录,首先复制所有外部库在vendor,然后在正确的地方。 (我认为)我也可以在Mercurial中做到这一点,subrepositories,但这是做到这一点的最好方法吗?

我试着为外部库设置不同的存储库,但似乎我不能将externalLibraryARepo拉到我主要存储库的externalLibraryA目录中?它进入主目录,这不是我想要的。我也可以创建一个Mercurial镜像库,并将其作为子库放入我的主库中,但是这个子目录中的更改会转到镜像库,而我希望它们留在主库中。

回答

1

我可能只是将它存储在一个存储库中 - 请注意,在链接中,您最终使用它们的构建系统将不同的回购站的二进制输出结合在一起。我不清楚他们的理由。

如果你想解决的根本问题是如何以一种干净的方式更新外部,我可能会使用anonymous branching

I.e.将外部库添加到您的项目和您的修改。确保它的工作。用ExternalA-v1.0标记。侵入你的实际项目。现在ExternalA,Inc.有了他们的新东西。将您的回购更新到ExternalA-v1.0标签。导入他们的新版本并在上面应用您的修改。承诺。现在你有两个头:一个带有最新版本的代码(与ExternalA-v1.0一起使用),另一个带有最新版本的ExternalA(可能不适用于你的代码)。那么你们合并并协调这两者。再次标记,现在使用ExternalA-v2.0。根据需要重复。

您仍然可以将您的外部存储在单独的存储库中,但我认为使用这些存储库的项目并不需要随时更新 - 看起来像供应商分支的整个点是依附者与受抚养者之间的某种隔离点。当然,将externalA项目中的更改转移到使用该项目的项目上将是一件手工事情(好吧,就像SVN中的副本一样)。

1

这取决于您的供应商代码是否将由您的团队定制。我们的团队在存储库中维护一个名为“供应商”的分支方面取得了很大的成功,我们在按项目名称命名的分支上进行了自定义。这个供应商代码很容易作为一个子库被包含在一个项目中。

这种方法的一个警告:如果在子库中正在进行有效的开发,最好直接将子库作为单独的克隆编辑,否则需要密切关注顶级库,不经意地将你的.hgsubstate转移到错误的修订版本并破坏你的构建。

注意顶级存储库(您的项目)在指向子库的不同命名分支的版本之间的合并,因为这会导致子库中“供应商”和“项目”分支之间的合并因为它递归,这可能不合意。

请注意,该功能在将来也可能会发生变化,因为最近几个月mercurial-devel邮件列表中有关subrepository递归未来的一些“热烈”讨论正在发生。

编辑: 我只是看到了相关链接讨论为好,这似乎是相关的:https://stackoverflow.com/a/3998791/1186771

相关问题