3

简而言之,我怎样才能使外部 mercurial 存储库完全不知道给定内部存储库的存在?我基本上只是想忽略子文件夹中某些 .hg* 的存在,并让外部存储库继续其快乐的方式。

换句话说,我希望有两个彼此无关的 mercurial 存储库,但恰好跟踪同一个文件。是 - 对该文件的编辑必须提交两次,等等;但在这种情况下,这就是我想要的。

背景:

我正在回避 mercurial 无法处理部分克隆的问题,但我相信它会起作用。我们有一个巨大的项目树检查到 mercurial,承包商需要访问这棵树的一部分。我对子存储库方法的理解是很难回溯到现有的树中。无论如何,我不想强​​迫我所有的同事这样做,这样我就可以与一个承包商合作。

我想做的是在我们整个项目树的克隆中的一两个文件夹中创建内部存储库。然后我计划将这些内部存储库进一步克隆给承包商。这不是最好的,但它会起作用;在他推送给我之后,我可以合并到内部存储库触及的文件,然后走到外部存储库检查我们的整体树。理想情况下,从外部存储库的角度来看,似乎一些魔法只是更新了一些文件。

问题是 mercurial 似乎对自己了解太多:)。例如,使用 hg init、hg add * 和 hg clone 时一切正常;但是当他在他的最后添加一个新文件并且我去 hg 在外部存储库中添加它时,我得到(混淆):

中止:路径 'foo/bar.txt' 在 repo 'foo' 内

我可以通过将内部存储库的 .hg 重命名为其他名称来解决它,但总的来说,这种方法已经失控了。hg stat 忽略内部存储库也有问题;以及我试图从外部存储库执行的其他命令和其他事情通常会中断(我在与承包商共享的一个文件夹中的子存储库中遇到了很多麻烦)。

有任何想法吗?

(我确实提出了一个理论上的解决方案:在我的文件系统的其他地方创建另一个存储库 baz/,然后使用文件系统符号链接从原始树中提取文件夹。但后来我硬连线到给定的机器连接两个存储库,我担心这种方法会产生我没有想到的其他后果。从外部的角度隐藏内部存储库会更方便。)

谢谢!

4

1 回答 1

2

我不认为有一种方法可以做你想做的事,但是将子目录变成子存储库并不难。唯一需要注意的是,一旦目录成为子存储库,就可以通过给目录一个新名称来更容易地在拆分前和拆分后的历史之间来回切换。

对于此示例,我有以下目录结构,并且我为每个文件伪造了一些历史记录:

org
 + file1
 + dir
    + file2

第 1 步- 启用convert扩展。
第 2 步- 创建文件映射以将dir历史记录移动到其自己的存储库的根目录。例子:

include dir
rename dir .

第 3 步- 运行转换,创建一个具有不同名称的目录。 第 4 步- 移动原项目下的新目录。
第 5 步- 从原始项目中删除旧目录。
第 6 步- 在新的子存储库中,更新到最新版本。
第 7 步- 在原始存储库中,添加一个.hgsub引用新子存储库的文件。
第 8 步- 添加.hgsub文件,修复所有引用旧目录的项目路径并提交。

例子:

hg convert --filemap filemap org sub
move sub org
cd org
hg remove dir
cd sub
hg update tip
cd ..
echo sub=sub >> .hgsub
REM Fix up other project paths referencing dir->sub.
hg ci -Am "Converted 'dir' to repo 'sub'."

现在您已经为您的承包商维护了历史记录,并且可以更新到旧版本或新版本的主要历史记录而不会发生冲突。当您更新到之前sub存在时,Mercurial 会正确更新sub为 null 父级并dir会出现在历史记录中。更新到历史的尖端,dir消失和sub更新。

于 2012-04-07T01:05:29.987 回答