3

我们最近从 Perforce 搬到了 Mercurial,并且喜欢它!

一个小问题:经过大量研究,我们无法弄清楚如何将存储库中的特殊目录映射到客户端的某个特殊位置。这是我们的 hg repo 的示例:

/foo/source files
/bar/source files
/build
    /macosx/mac make files
    /win/windows make files

使用 Perforce,我们使用客户端规范映射将 //depot/build/macosx/... 映射到 Mac 客户端上的 /build/...,并将 //depot/build/win/... 映射到 /build /... 在 Windows 开发人员框中。目录 foo 和 bar 按原样同步。/foo 和 /bar 中的 Makefile 假定我们的构建 makefile 位于 /build 中,我们希望保持原样。最终的客户端文件集应如下所示:

/foo/source files
/bar/source files
/build/client specific make files

我已经阅读了关于 subrepos 的信息,但是这个解决方案似乎不是特定于客户端的。

任何想法如何解决这个问题将不胜感激!

4

3 回答 3

3

您不能使用 Mercurial 仅签出存储库的一部分。

您总是会得到一个包含所有内容的克隆,并且工作目录也将包含所有内容。

使用 Mercurial,您应该努力为 1 个项目拥有 1 个存储库,以便您获得的所有内容在逻辑上属于一起,然后您就不应该只需要其中的一部分。

这也意味着您在 Mercurial 存储库中的任何目录结构都将始终与您在磁盘上的结构完全匹配。

于 2010-11-11T14:25:14.330 回答
2

Mercurial 无法做到这一点,因为它没有客户端与仓库分开的概念。

但是,您可以在 Mac OS X (ln -s) 上使用符号链接,在 Windows 上使用联结点(在 Vista 上使用 mklink 以及在 XP 上使用联结工具http://technet.microsoft.com/en-us/sysinternals/bb896768 .aspx ) 在文件系统级别解决此问题。

或者,您可以使用 Makefiles 中的变量来引用构建目录(例如$(BUILD)/something.ext,而不是build/something.ext)。

于 2010-11-11T14:31:30.190 回答
1

这种映射不能在 Mercurial 中完成。“窄”克隆有一个出色的 TODO 项,因此您可以只检查一个子目录。我可以看到支持这种功能的实现。但话又说回来,我知道这样的事情会被认为有点太“聪明”(读起来很复杂),而且这个想法会有很多反对意见。

同时,我会建议这两种解决方案之一。

  1. 符号链接。将符号链接放入build您的.hgignore文件中的目录。然后每个人都可以创建自己的符号链接到相应的构建文件目录。这样做的缺点是不能在没有符号链接的平台上工作。
  2. 在顶级 makefile 中使用的环境变量,用于构造它应该调用的特定于平台的 makefile 的路径。
于 2010-11-11T14:34:22.503 回答