Mercurial 存储库窄克隆?

标签 mercurial repository

因新见解而更新:五年后看到这个问题时,我意识到这源于尝试使用版本控制系统作为包管理器。这当然会导致各种意想不到的问题,我们不应该这样使用它。如果您正在阅读此问题,我建议您搜索适合您首选语言的包管理器。

我原来的问题:我目前正在从 Subversion 迁移到 Mercurial,我不得不说我并不后悔这个决定。然而,当尝试转换我的项目时,我遇到了 Mercurial 的问题,我似乎无法解决这个问题。我有两个不同的项目:一个是框架,另一个是依赖于该框架的应用程序。存储库如下所示:

框架存储库:

  • 文档/
  • 部署/
  • 库/
  • 测试/

应用程序存储库:

  • 申请/
  • 配置/
  • 库/
  • 测试/
  • www/

我希望应用程序的 lib 目录包含框架的 lib/目录的副本。我曾经使用 svn:externals 来做到这一点。现在,我知道 Mercurial 支持 concept of subrepositories ,但这似乎不是“正确”的解决方案,因为它实际上并没有像我想要的那样拉入 lib/目录,因为您仍然需要手动拉动和推送更改。另外,一旦克隆框架存储库,您将获得它的全部,而不仅仅是 lib/目录。我只需要 lib/目录,不需要测试或文档。

现在,我想出了两种不同的解决方案来解决这个问题,但我想知道哪一个是最好的。第一个解决方案是将框架完全克隆到不同的目录中,并在应用程序的 lib/目录中创建指向框架的 lib/目录的符号链接(symbolic link)。我认为将符号链接(symbolic link)放入 .hgignore 应该确保一切顺利?这意味着您可以编辑框架代码并提交它,您也可以编辑应用程序的代码并提交它。

另一个选择是拥有多个存储库。框架作为一个整体被拉取,这意味着您将获得 docs/、deploy/、test/等目录,这些目录对于框架的使用来说是不需要的。我认为也许纯粹为库创建一个存储库可能是一个解决方案,尽管我真诚地怀疑它,因为单元测试非常依赖于库本身。

有人知道解决这个问题的好方法吗?

最佳答案

您应该将单独的组件放在它们自己的存储库中。然后,当您创建应用程序时,您可以使用convert extension创建一个不同于普通框架存储库的 Pullabale 框架存储库:

$ hg convert --filemap map.txt framework new-framework

map.txt 包含重命名/包含/排除(以下内容应仅包含 lib 目录并将其中的所有内容移至存储库根目录):

include lib
rename lib .

从应用程序存储库中,您现在可以只提取框架存储库(第一次使用 -f,因为存储库可能彼此无关)。

$ cd project
$ hg pull -f ../new-framwork
$ hg merge

现在,当开发继续进行时,您只需在每次拉取之前重新创建转换后的存储库即可。我们实际上有一个hook在我们的框架存储库上,在每个变更组(=每次推送)上重新创建转换后的存储库。

这样,您就可以在自己的存储库中拥有两个工作区域(应用程序和框架),而应用程序存储库包含完整的框架历史记录,并且可以通过简单地从转换后的存储库中提取来进行更新。

关于Mercurial 存储库窄克隆?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4691286/

相关文章:

git - 如何在 git rm 并推送到 github 后取消删除文件?

android - 将 git 与使用 repo 检索的 android 源存储库一起使用

mercurial - 如何配置 Mercurial 在 merge 时使用 Kompare?

git - Mercurial 客户端和 GitLab?

Mercurial 寻呼机扩展

git - 我们可以使用 HDFS 来存储 git 存储库吗?

asp.net-mvc - 为服务层设计 DI(构造函数注入(inject))存储库

git - 如何修复丢失的 git 远程详细信息?

mercurial - 如何在 Mercurial 中搜索特定更改?

python - 将 win32lfn 扩展与 Mercurial 捆绑在一起