发散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
命令时,每个变更集都会并行运行。
使用汞再次以其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-库之一仍是相关的。当分割过程不在分支的开始处分割变形时会发生这种情况,因为这些变形不包含应该以不同的子变量结尾的文件。因此,不需要创建新的变更。
我试过了。它只包含相关文件的历史记录(好的...),但我仍然可以从其他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
以验证它们确实是相关的。这也应该告诉你一些关于他们为什么相关的事情。
如果您的文件地图在两次转换中确实包含不同的子树,那么我看不到存储库是如何关联的。因此,您的包含/排除规则可能有重叠,这样两个转化中的第一个变更集都是相同的?
我理解你的帖子。我今天晚上要去测试它。谢谢。我会跟进新的信息。 – 2009-09-15 16:06:49
分散存储库很简单;只要你认为合适的克隆/推/拉。 Mercurial将把分散的存储库视为相关的。标准mercurial没有办法阻止成功从相关存储库拉取; “hg pull”假设你知道你在做什么。
如果从分歧库不必要的变更的一大堆不要被拉进去,就可以清除掉的变更你不想通过:
- 重命名库
- 克隆重命名库回原始名称,使用-r到
选择你想要的头。 - (可选)将您在混淆存储库中获得的头推到 适当的分歧存储库,这样您就不会丢失任何东西 。
- 删除重命名的存储库。
根据您的环境,您可能可以设置某些人员,文件权限和/或Web服务来保证您想要什么。
如果你真的想阻止人们结合回购,依靠汞推拒绝未合并的头是不是很可靠;一个简单的CD一个& &汞柱取出两个& &汞柱推会悄悄将它们合并,合并回购。如果你真的想要防止这种情况发生,可以在服务器上写一个pretxncommit钩子(对于两个仓库中的每一个仓库)拒绝任何尝试推送一个已知只在另一个仓库中的特定变更集。
您可以简单地使用hg convert --config convert.hg.saverev = 1,这会使伪克隆被视为“无关”(并保留有关原始变更集ID的信息)。但是我使用服务器端钩子的其他建议更直接,更清晰。 – 2011-02-24 15:45:14