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

如何使mercurial(hg)外部存储库忽略内部(非子)存储库的存在,mercurial,Mercurial,简言之,如何使外部mercurial存储库完全不知道给定的内部存储库的存在?我基本上只是想忽略子文件夹中存在的某些.hg*,让外部存储库继续它的快乐方式 换句话说,我希望有两个mercurial存储库,它们彼此无关,只是碰巧跟踪同一个文件。是-对该文件的编辑必须提交两次,以此类推。;但在这种情况下,这就是我想要的 背景: 我正在避开mercurial无法处理部分克隆人的问题,我认为这是一种很有技巧的方法,但我相信它会奏效。我们在mercurial中检查了一个巨大的项目树,承包商需要访问该树的一部

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

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

背景:

我正在避开mercurial无法处理部分克隆人的问题,我认为这是一种很有技巧的方法,但我相信它会奏效。我们在mercurial中检查了一个巨大的项目树,承包商需要访问该树的一部分。我对子存储库方法的理解是,很难对现有的树进行反向攻击;不管怎样,我不想为了和一个承包商合作而把这件事强加给我所有的同事

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

问题是mercurial似乎对自己了解太多:)。例如,hg init、hg add*和hg clone的工作进展顺利;但是,当他在他那端添加了一个新文件,我去了hg在outter存储库中添加该文件时,我得到了(混淆):

中止:路径“foo/bar.txt”位于repo“foo”内

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

有什么想法吗

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


谢谢!

我不认为有什么方法可以满足您的要求,但将子目录转换为子存储库并不难。唯一需要注意的是,在拆分前和拆分后的历史记录之间来回切换更容易,因为一旦该目录成为子存储库,就给它一个新名称

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

org
 + file1
 + dir
    + file2
步骤1-启用
转换扩展。
步骤2-创建一个文件映射,将
dir
历史记录移动到其自身存储库的根目录。示例:

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

例如:

include dir
rename dir .
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
更新。

相关问题:。我会尝试两个repo之间的文件或目录之间的符号链接