2011-01-14 38 views
2

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

我的原问题:我目前正在从Subversion转移到Mercurial,我不得不说我不后悔这个决定。然而,当试图转换我的项目时,我碰到了一个Mercurial的问题,我似乎无法修复。我有两个不同的项目:一个是框架,另一个是依赖于该框架的应用程序。下面是该仓库的样子:

框架库:

  • 文档/
  • 部署/
  • 的lib/
  • 测试/

应用程序库:

  • 应用/
  • 配置/
  • 的lib/
  • 测试/
  • WWW/

我想什么是应用程序的lib目录中包含的副本框架的lib /目录。我曾经使用svn:externals来做到这一点。现在,我知道Mercurial支持concept of subrepositories,但这看起来不像“正确”的解决方案,因为它实际上并不像我想要的那样拉入lib /目录,因为您仍然必须拉和推手动更改。这个,再加上一次你克隆框架库,你会得到所有它,而不仅仅是lib /目录。我只需要lib /目录,而不是测试或文档。

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

另一种选择是拥有多个存储库。整个框架被取消,这意味着您将获得docs /,deploy /,test/etc.目录,这些目录在框架的使用不需要。我认为可能纯粹为图书馆创建一个存储库可能是一个解决方案,尽管我真诚地怀疑它,因为单元测试非常依赖图书馆本身。

有没有人知道这个问题的体面的解决方案?

+0

类似问题(和答案)在上[如何克隆在水银的存储库的子文件夹?(http://stackoverflow.com/questions/920355/how-do-i-clone-a- sub-folder-of-a-repository-in-mercurial/40355673) – Anon 2016-11-01 07:24:21

回答

2

如果您只需要引用库,则应将库分隔成单独的存储库。

只要你真正只需要参考它。引用包含lib目录+其他内容的存储库的问题是什么,除了“它感觉不对”之外呢?

至于“仍然需要手工拉动和拉动”,当你拉动你的主克隆时,它也会拉动subrepos,但它不会将它们更新为新版本,这是一件好事,你需要手动完成,就像使用Subversion一样。

+0

那么,那。将单元测试放在生产环境中感觉不对:它应该没有这些能力。我将把lib分成它自己的存储库,所以我可以这样做,谢谢你的回答。 – 2011-01-17 09:00:15

+0

通常这是通过部署脚本处理的 – 2011-01-17 12:14:03

2

您应该将不同的组件放在它们自己的存储库中。然后,当创建应用程序,则可以使用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,它在每个更改组(每次推送)上重新创建转换后的回购。

这种方式,你有自己的仓库都工作区(应用程序和框架),而应用程序回购包含完整的框架,历史,能够通过简单地从转换回购拉动更新。