发散Mercurial资源库中两个不同的存储库

问题描述:

和许多人一样,我有一个包含多个项目的几个SVN仓库。我决定将其中一个存储库转换为Mercurial,原因有几个。发散Mercurial资源库中两个不同的存储库

我已经成功地转换使用instructions located here库。新的hg回购包括一切;所有的历史和正确的标签。转换效果很好。

现在,我需要“分歧”两个项目,但我想,以保持双方的历史。我想知道是否有办法做到这一点,以防止意外地将变更集导入其他存储库。

要清楚,我不关心每个库都会有相同的历史设置回(其实,我想这一点)的电流变化。我只是想以某种方式表明它们从现在开始是“不同的”存储库...

更新:有人可以详细说明--force吗?该标志在什么时候是必要的。在http://www.selenic.com/mercurial/hg.1.html,在“拉”,我看到-f,--force选项是“运行,即使远程仓库是不相关的” 但是是什么让一个仓库无关?对我来说,因为我从原始存储库克隆他们是(或可能)相关... ...

更新:我试图阻止的是允许一个回购后被拉入其他回购一段时间过去了。 (现在是这种情况)。我写了一个产生问题的脚本。而正好完成什么,我不希望发生的事情(这是一个Windows批处理文件):

@echo off 

REM - First, create two distinct repos. 
REM - Add some files to each. 

MD test1 
MD test2 

cd test1 
hg init 

REM - Do several writes and commits to give content to the repo. 

echo This is some text for test1 > test1.txt 
echo This iss some more text; blah blah; >> test1.txt 

echo Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer sapien velit, hendrerit sit amet ultrices nec, malesuada a mauris. Mauris eget nisi sit amet diam sodales tristique nec at turpis. Nam viverra pulvinar est, quis accumsan nunc fringilla ut. Nullam eu massa sapien, ac molestie magna. Curabitur nec pharetra nibh. Pellentesque velit dui, placerat vel porta eget, malesuada vitae dolor. In a lectus vel sapien imperdiet fringilla quis eu odio. Donec pellentesque ante nec est iaculis a aliquam nibh varius. Vivamus sit amet dolor non lorem ullamcorper ultricies quis in risus. Mauris eget orci leo. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Mauris ut lorem lacus. In hac habitasse platea dictumst. Mauris pellentesque purus non elit molestie vehicula. >> test1.txt 
echo This is another text file for test1 > test2.txt 

hg addremove 
hg commit -m"First commit on test1" 


echo Nunc mollis, neque vel tempus iaculis, eros erat egestas metus, vitae condimentum tortor tortor id sem. Integer ac ante quis nisl condimentum iaculis. Vestibulum et quam vel lectus porta ultricies. Donec ultricies dignissim sollicitudin. Morbi sit amet est urna, a bibendum felis. In aliquet, tortor nec consequat ultricies, sapien diam eleifend nulla, in ullamcorper eros sapien ac magna. Phasellus sit amet congue quam. Nulla gravida justo aliquam libero tristique non tempor nunc mollis. Suspendisse venenatis tincidunt massa, a tempus odio blandit non. Suspendisse egestas orci lorem. Curabitur bibendum nibh quis elit tempus id suscipit nisl viverra. Pellentesque placerat nisl at felis porta laoreet. >> test1.txt 
hg commit -m"second commit on test1" 

echo Nunc placerat cursus scelerisque. Sed ac magna lacus, quis facilisis elit. Praesent mattis purus in urna congue auctor. Fusce pellentesque scelerisque dictum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Vivamus vulputate nunc quis ante laoreet posuere. Curabitur ante turpis, blandit vitae dapibus vitae, convallis at tortor. Sed augue leo, fermentum id consequat et, accumsan in neque. In pellentesque luctus nisi, ac sagittis nisl condimentum tincidunt. Cras nec dui vitae purus adipiscing consectetur id at mi. Vestibulum quis est vitae purus dictum mollis. Phasellus ultrices rhoncus eleifend. Sed sit amet euismod orci. Curabitur id turpis tortor, nec mollis neque. Praesent egestas augue vitae sem fringilla at molestie lacus venenatis. >> test1.txt 

hg commit -m"thrid commit on test1" 

echo Suspendisse nec porta velit. Donec aliquet mi vel felis tempor vehicula vitae interdum quam. Phasellus tempor orci at ligula adipiscing sagittis. Quisque faucibus accumsan dui vel facilisis. Pellentesque laoreet quam vel nisl mattis ac venenatis sapien suscipit. Nam eget dictum risus. Proin quam magna, volutpat quis congue vitae, dapibus et mi. Etiam tempus purus ut massa sodales sed cursus odio ultrices. Ut vel dictum urna. Fusce blandit dignissim nibh a tempus. Nullam libero arcu, feugiat vel sollicitudin vitae, lacinia pulvinar enim. Nulla hendrerit faucibus tortor, sit amet convallis velit vehicula ut. Cras leo sem, fermentum eu adipiscing non, bibendum et lacus. Nulla volutpat tortor non libero feugiat fermentum id quis sem. Vivamus lobortis nibh quis diam semper feugiat. Phasellus ac lobortis purus. Vivamus at mi sem. Quisque accumsan consequat placerat. >> test1.txt 

hg commit -m"fourth commit on test1" 

cd .. 

cd test2 
hg init 

echo Nala is a cat >> myCats.txt 
hg addremove 
hg commit -m"first commit on test2" 

echo Simba is a cat >> myCats.txt 
hg commit -m"2nd commit on test2" 

echo Nanoon is a cat >> myCats.txt 
hg commit -m"3rd commit on test2" 

cd .. 

REM ------------------------------------------------------------------------------------------------------------------------------------------------------ 

hg clone --pull test1 test-combined 

cd test-combined 
hg pull ../test2 

echo - 
echo You should have gotten a "abort: repository is unrelated" error. 
echo this is from attempting to pull test2 in to the test-combined. Can't without --force flag. 

echo This is another file for combined repo > combinedRepo.txt 
echo This should be unique to test-combined >> combinedRepo.txt 
hg addremove 
hg commit -m"1st Change to combined repo" 

echo Fusce lectus arcu, cursus et dictum et, ultrices ut magna. Cras ultrices leo ac arcu commodo auctor. Pellentesque commodo sem et elit euismod posuere. Nam cursus, nisl ut placerat tincidunt, diam ante congue felis, id facilisis sem eros nec augue. Phasellus vel interdum est. Nunc at tellus non dui aliquam placerat nec placerat augue. Vestibulum justo sem, laoreet et blandit eu, mollis a nibh. Cras convallis, turpis quis vulputate euismod, risus neque convallis dui, posuere eleifend dolor quam ut dui. Integer pharetra porttitor lorem, vitae commodo mi semper non. Duis ipsum nisi, vulputate vel cursus ut, consectetur eu tellus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Fusce lobortis quam molestie leo scelerisque blandit. Ut massa neque, dapibus rutrum porta et, molestie vitae augue. Mauris eu erat a turpis suscipit viverra. Praesent vitae ante non dui volutpat ullamcorper eu in nisl. >> combinedRepo.txt 
hg commit -m"2nd Change to combined repo" 

cd .hg 

rem - Replace the hgrc file where we blank out the default file. 
echo [paths] > hgrc 
echo default = >> hgrc 

cd .. 
cd .. 
REM - We are not back in the starting folder... 
REM ------------------------------------------------------------------------------------------------------------------------------------------------------ 

cd test1 
echo A third file to make yet another commit in the repo. > myThirdFile.txt 
hg addremove 
hg commit -m"a third file to make this (test1) different than test-combined" 
cd .. 

REM - Retry the pull - Same source but diverged repos. 
cd test-combined 
hg pull ../test1 

ECHO - 
ECHO The pull just executed (in test-combined) succeeded but we want to prevent this. 
ECHO Here is the log for test-combined 

hg log 

cd .. 
@echo on 

要运行这个,创建一个空目录,并保存在代码块中的文本到。 cmd文件。打开一个命令窗口并导航到该文件并执行.cmd。

你会看到日志文本上方以下内容:

加1名的变更与1个变为1个 文件(+1头)(运行 'HG头' 来 看到头,“汞合并'合并)

日志文本显示两个回购确实是合并的。 在我理想的解决方案中,这会导致错误或请求--force标志。

更新(9/10/2009):hg convert没有为我所需要的工作。

虽然可能有不同的解决方案,我给定的问题,我最后写的是创造了一个新鲜的回购和它带来的东西的脚本。

由于脚本是外部的水银,水银分配了新的变更ID(其最终给我一个新的根)和基本上发散回购。我的脚本做了(我想)hg convert做的,但它做到了这样一种方式,结果仓库被认为是不同的。如果我将它们重新合并(为了争辩),它们将不会代表它们的来源。直到我在这个假设的重新合并上执行merge命令时,每个变更集都会并行运行。

+0

您可以简单地使用hg convert --config convert.hg.saverev = 1,这会使伪克隆被视为“无关”(并保留有关原始变更集ID的信息)。但是我使用服务器端钩子的其他建议更直接,更清晰。 – 2011-02-24 15:45:14

克隆存储库,然后只需从新克隆中删除原始远程repo路径(这样就不可能将更改推回到旧的repo),并且您应该拥有一个新的完全独立的存储库。

+0

你谈论的.hg文件夹中的文件hgrc,是吗?我已经做到了。我觉得这是第一步。谢谢。还有什么? – 2009-09-03 23:21:11

+0

你应该很好去。 – Amber 2009-09-03 23:37:22

+2

只要回购是分歧的唯一方法推到另一个是使用 - 力量。所以你不会意外地做到这一点。 – tonfa 2009-09-04 00:10:53

使用汞再次以其filemap选项转换为筛选档案。

diverge>hg init repo 
diverge>cd repo 
diverge\repo>echo some text > file1.txt 
diverge\repo>hg ci -A -m "added first file" 
adding file1.txt 

diverge\repo>echo more text > file2.txt 
diverge\repo>echo 123 >> file1.txt 
diverge\repo>hg ci -A -m "some changes and new file" 
adding file2.txt 

diverge\repo>hg log 
1[tip] 0f37e61d075b 2009-09-11 10:35 +0200 wierob83 
    some changes and new file 

0 b04d9d12fb1d 2009-09-11 10:34 +0200 wierob83 
    added first file 


diverge\repo>cd .. 
diverge>echo include file1.txt > files-in-repo-one.txt 
diverge>echo exclude file1.txt > files-in-repo-two.txt 
diverge>hg convert --filemap files-in-repo-one.txt repo new-repo-one 
initializing destination new-repo-one repository 
scanning source... 
sorting... 
converting... 
1 added first file 
0 some changes and new file 

diverge>hg convert --filemap files-in-repo-two.txt repo new-repo-two 
initializing destination new-repo-two repository 
scanning source... 
sorting... 
converting... 
1 added first file 
0 some changes and new file 

diverge>cd new-repo-two 
diverge\new-repo-two>hg out ..\repo 
comparing with ..\repo 
searching for changes 
abort: repository is unrelated 

diverge\new-repo-two>hg push ..\repo 
pushing to ..\repo 
searching for changes 
abort: repository is unrelated <-- can't push because its an independent repo 

所以它应该有工作,但是:

diverge\new-repo-two>cd ..\new-repo-one 
diverge\new-repo-one>hg out ..\repo 
comparing with ..\repo 
searching for changes 
1[tip] 62119640bde6 2009-09-11 10:35 +0200 wierob83 
    some changes and new file 

第二回购似乎仍与(我之前不知道)。

我不确定这是预期行为还是错误。

更新:

您可以从原来的仓库拉,如果创建SUP-库之一仍是相关的。当分割过程不在分支的开始处分割变形时会发生这种情况,因为这些变形不包含应该以不同的子变量结尾的文件。因此,不需要创建新的变更。

+0

我试过了。它只包含相关文件的历史记录(好的...),但我仍然可以从其他hg转换的回购站中取消强制标记。所以这似乎没有工作... – 2009-09-10 22:45:45

若要回答有关相关存储库的问题的部分:如果两个Mercurial存储库共享一个公共根,则它们是相关的。

更确切地说,如果两个存储库A和B共享一个或多个更改集,则它们是相关的。假设A和B共享变更集X.通过“变更集X”,我的意思是使用哈希X的变更集 - 哈希值是变更集的标识。哈希值是从父变更集的哈希值,日期,提交者和更改本身递归计算的。这意味着,我们可以看到,A和B必须共享一个共同的根源变更,这是变更X的祖先A和B都必须共享X.继续像这样的家长变更

这使我们有共同的定义相关:他们必须有共同的根。你通常只能有一个根变更,你可以看看它是这样的:

hg log --rev 0 

对于你的情况,我的猜测是,转换创造了两次转换同根变更。您应该在两个克隆中检查hg log以验证它们确实是相关的。这也应该告诉你一些关于他们为什么相关的事情。

如果您的文件地图在两次转换中确实包含不同的子树,那么我看不到存储库是如何关联的。因此,您的包含/排除规则可能有重叠,这样两个转化中的第一个变更集都是相同的?

+0

我理解你的帖子。我今天晚上要去测试它。谢谢。我会跟进新的信息。 – 2009-09-15 16:06:49

分散存储库很简单;只要你认为合适的克隆/推/拉。 Mercurial将把分散的存储库视为相关的。标准mercurial没有办法阻止成功从相关存储库拉取; “hg pull”假设你知道你在做什么。

如果从分歧库不必要的变更的一大堆不要被拉进去,就可以清除掉的变更你不想通过:

  1. 重命名库
  2. 克隆重命名库回原始名称,使用-r到
    选择你想要的头。
  3. (可选)将您在混淆存储库中获得的头推到 适当的分歧存储库,这样您就不会丢失任何东西 。
  4. 删除重命名的存储库。

根据您的环境,您可能可以设置某些人员,文件权限和/或Web服务来保证您想要什么。

如果你真的想阻止人们结合回购,依靠汞推拒绝未合并的头是不是很可靠;一个简单的CD一个& &汞柱取出两个& &汞柱推会悄悄将它们合并,合并回购。如果你真的想要防止这种情况发生,可以在服务器上写一个pretxncommit钩子(对于两个仓库中的每一个仓库)拒绝任何尝试推送一个已知只在另一个仓库中的特定变更集。