我想在Mercurial中存储一个项目,该项目包含来自Git和SVN存储库的外部代码(可由我修改)。在SVN中,我会用vendor branches解决这个问题并复制代码,但我在Mercurial it's better to have different repositories for different projects中理解它,并在需要时将它们拉到它们之间。
项目布局如下:
- 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中,我会创建vendor
目录和trunk
目录,首先在vendor
中复制所有外部库,然后在trunk
中的正确位置复制。 (我认为)我也可以使用subrepositories在Mercurial中执行此操作,但这是最好的方法吗?
我尝试为外部库设置不同的存储库,但是我似乎无法将externalLibraryARepo
拉入主存储库的externalLibraryA
目录中?它进入主目录,这不是我想要的。我还可以创建一个Mercurial镜像存储库,并将其作为子存储库包含在我的主存储库中,但是此子目录中的更改将转到镜像存储库,而我希望它们保留在主存储库中。
答案 0 :(得分:1)
我可能只是将它存储在一个存储库中 - 请注意,在您给出的链接中,他们最终使用他们的构建系统将来自不同存储库的二进制输出汇集在一起。我不清楚他们在那里的理由。
如果您尝试解决的基本问题是如何以干净的方式更新外部,我可能会使用anonymous branching。
即。将外部lib添加到项目和修改中。确保它有效。用ExternalA-v1.0标记。劈开你的实际项目。现在ExternalA,Inc。有他们的新东西。将您的仓库更新为ExternalA-v1.0标记。导入他们的新版本并在顶部应用您的修改。承诺。现在你有两个脑袋:一个带有最新版本的代码(适用于ExternalA-v1.0),另一个带有最新版本的ExternalA(可能与你的代码不兼容)。那么你就合并并调和两者。再次标记,现在使用ExternalA-v2.0。根据需要重复。
您仍然可以将您的外部设备保存在单独的存储库中,但我认为使用它们的项目不需要始终保持最新的更改 - 看起来供应商分支的整个要点就是拥有一些依赖者和家属之间的孤立点。当然,将更改从externalA项目移动到正在使用它的项目将是一个手动事件(好吧,副本,就像真正的SVN一样)。
答案 1 :(得分:1)
这取决于您的供应商代码是否将由您的团队自定义。我们的团队在存储库中维护一个命名的“供应商”分支方面取得了很大的成功,我们在项目名称所指定的分支上进行了自定义。然后,该供应商代码很容易作为子库存储在项目中。
对此方法的一个警告:如果在子存储库中进行主动开发,最好将其直接编辑为子库作为单独的克隆,否则有必要密切关注顶级存储库,以便您不要无意中将你的.hgsubstate推向错误的版本并打破你的版本。
注意在指向子存储库的不同命名分支的版本之间合并顶级存储库(您的项目),因为这可能导致子存储库中“vendor”和“project”分支之间的合并它是递归,这可能是不可取的。
请注意,此功能在将来也可能会发生变化,因为最近几个月在mercurial-devel邮件列表上发生了一些关于子存储库递归未来的“热烈”讨论。
编辑: 我刚刚在相关链接中看到了这个讨论,这似乎是相关的:https://stackoverflow.com/a/3998791/1186771