如何使mercurial(hg)外部存储库忽略内部(非子)存储库的存在

时间:2012-04-06 21:34:54

标签: mercurial

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

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

背景:

我正处于侧面踩着mercurial无法处理部分克隆的过程中,有些东西是hackish但我相信它会起作用。我们将一个巨大的项目树检入mercurial,承包商需要访问该树的一部分。我对子存储库方法的理解是,很难回溯到现有的树;无论如何,我不想强​​迫所有同事,所以我可以与一个承包商合作。

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

问题在于,mercurial似乎对自己了解得太多了:)。例如,事情进展顺利,有一个hg init,hg add *和hg clone;但是当他在他的最后添加了一个新文件并且我在hg中添加了这个文件时,我得到了(模糊处理):

abort:path'foo / bar.txt'在repo'foo'

里面

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

有什么想法吗?

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

谢谢!

1 个答案:

答案 0 :(得分: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更新为空父级,并且dir将显示在历史记录中。更新到历史记录提示,dir消失,sub更新。