5

我想在 Mercurial 中存储一个项目,其中包含来自 Git 和 SVN 存储库的外部代码(可由我修改)。在 SVN 中,我会使用供应商分支来解决这个问题并复制代码,但我知道在 Mercurial 中,最好为不同的项目提供不同的存储库,并在需要时在它们之间拉取。

项目布局将是这样的:

- externalLibraryA [来自 SVN 存储库]
  - ...还有我的一些额外文件
 - externalLibraryB [来自 SVN 存储库]
  - ...还有我的一些额外文件
  - externalPluginForExternalLibraryB [来自 Git 存储库]

在 Subversion 中,我会创建vendordir 和一个trunkdir,首先将所有外部库复制vendortrunk. (我认为)我也可以在 Mercurial 中使用subrepositories执行此操作,但这是最好的方法吗?

我尝试为外部库设置不同的存储库,但似乎我无法将其拉入主存储库externalLibraryARepoexternalLibraryA目录?它进入主目录,这不是我想要的。我还可以创建一个 Mercurial 镜像存储库并将其作为子存储库包含在我的主存储库中,但是随后此子目录中的更改会转到镜像存储库,而我希望它们保留在主存储库中。

4

2 回答 2

1

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

这种方法的一个警告:如果子存储库中正在进行积极的开发,最好将其作为单独的克隆直接编辑子存储库,否则有必要密切关注顶级存储库,以免无意中碰到您的 .hgsubstate 转发到错误的修订版并破坏您的构建。

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

请注意,此功能在未来也可能会发生变化,因为最近几个月在 mercurial-devel 邮件列表上进行了一些关于子存储库递归未来的“热烈”讨论。

编辑:我刚刚在相关链接中也看到了这个讨论,这似乎是相关的:https ://stackoverflow.com/a/3998791/1186771

于 2012-02-03T05:35:26.233 回答
1

我可能只是将它存储在一个存储库中 - 请注意,在您提供的链接中,他们最终使用他们的构建系统来汇集来自不同存储库的二进制输出。我不清楚他们在那里的理由。

如果您要解决的潜在问题是如何以干净的方式更新外部,我可能会为此使用匿名分支

即将外部库添加到您的项目,以及您的修改。确保它有效。使用 ExternalA-v1.0 标记。破解您的实际项目。现在,ExternalA, Inc. 有了他们的新版本。将您的存储库更新为 ExternalA-v1.0 标记。导入他们的新版本并在顶部应用您的修改。犯罪。现在你有两个头:一个是你的代码的最新版本(与 ExternalA-v1.0 一起使用),另一个是 ExternalA 的最新版本(可能不适用于你的代码)。然后你合并和调和两者。再次标记,现在使用 ExternalA-v2.0。根据需要重复。

您仍然可以将您的外部文件保存在单独的存储库中,但我认为使用这些文件的项目不需要一直与那里的更改保持同步 - 看起来供应商分支的全部意义在于有一些隔离点受抚养人和受抚养人之间。当然,将更改从 externalA 项目移动到正在使用的项目将是手动的事情(嗯,一个副本,真的很像在 SVN 中)。

于 2011-03-15T12:45:24.993 回答