Visual studio 2010 使用hg将具有存储库的不同项目合并到单个解决方案中?

Visual studio 2010 使用hg将具有存储库的不同项目合并到单个解决方案中?,visual-studio-2010,mercurial,merge,projects-and-solutions,changeset,Visual Studio 2010,Mercurial,Merge,Projects And Solutions,Changeset,我在VisualStudio2010中启动了两个不同的项目,每个项目都有自己的hg存储库 后来我决定这两个项目属于一个解决方案,因此属于一个hg存储库 新解决方案包含以下文件结构: SolutionFolder |---.hg +---Lib | ∟ dlls +---Source | ∟ Project_A | ∟--.hg | ∟ Project_B | ∟--.hg +---Overarchin

我在VisualStudio2010中启动了两个不同的项目,每个项目都有自己的hg存储库

后来我决定这两个项目属于一个解决方案,因此属于一个hg存储库

新解决方案包含以下文件结构:

SolutionFolder
   |---.hg
   +---Lib
   |    ∟ dlls
   +---Source
   |    ∟ Project_A
   |      ∟--.hg  
   |    ∟ Project_B
   |      ∟--.hg
   +---OverarchingSolution.sln
是否有一种方法可以
Project\u a
Project\u B
的变更集保存到解决方案文件夹的存储库中

从而导致:

SolutionFolder
   |---.hg
   +---Lib
   |    ∟ dlls
   +---Source
   |    ∟ Project_A
   |    ∟ Project_B
   +---OverarchingSolution.sln

Project\u A
Project\u B
中的所有变更集登录到SolutionFolder的存储库中时?

如果您可以更改历史记录(即:使此项目的所有其他克隆无效),您可以使用“转换”扩展

创建文本文件,我们将其命名为
rename-map-a.txt
其中的这一行:

rename . Source/Project_A
然后进入
Source
并运行:

hg convert --filemap rename-map-a.txt Project_A new-Project_A
对B重复相同的过程,以便现在您有:

SolutionFolder
   |---.hg
   +---Lib
   |    ∟ dlls
   +---Source
   |    ∟ Project_A
   |      ∟--.hg  
   |    ∟ Project_B
   |      ∟--.hg
   |    ∟ new-Project_A
   |      ∟--.hg  
   |    ∟ new-Project_B
   |      ∟--.hg
   +---OverarchingSolution.sln
然后进入
SolutionFolder
并运行以下命令:

hg init   # creates a new, empty repo
hg pull Source/new-Project_A   # pulls in changesets from A
hg pull --force Source/new-Project_B   # pulls in changesets from A
如果这样做有效,您可以删除(或者最好移动到某个地方备份这些目录):

SolutionFolder/Source/Project_A/.hg
SolutionFolder/Source/Project_B/.hg
SolutionFolder/Source/new-Project_A
SolutionFilder/Source/new-Project_B

在你的问题中,你的目标是什么,所有的历史和一切都被跟踪。也就是说,看看我的另一个答案,我认为这是一个更好的主意。

如果你认为有机会你会想再次单独使用这两个存储库(即:在不同的解决方案中使用其中一个,而不是另一个)然后您可以将它们作为新顶级存储库的子存储库

为此,您只需将cd放入
SolutionFolder
并创建一个名为
.hgsub
的文件,其中包含以下行:

Source/Project_A = Source/Project_A
Source/Project_B = Source/Project_B
然后运行这些命令(仍在
SolutionFolder
):


之后,您可以在Solution文件夹(
status
commit
,等等)中使用一个额外的
--subrepos
参数执行大部分常规Mercurial命令,它们将级联到子repos中。

一种方法是使用
hg pull-f
。 这将产生一个具有多个根的存储库。 您仍将拥有两个回购协议的历史记录,这将由存储库中的两条开发线表示

这里唯一的诀窍是正确的目录结构。您希望合并的回购协议的根与合并的回购协议的根匹配

所以对于你的情况,我可以想象这样的情况:

C:\> move SolutionFolder\Source\Project_A Temp_Project_A C:\> cd Temp_Project_A C:\Temp_Project_A> mkdir Source\Project_A C:\Temp_Project_A> hg rename * Source\Project_A C:\Temp_Project_A> hg ci -m "moved all Project_A files down in preparation for combining repos" C:\Temp_Project_A> cd ..\SolutionFolder C:\SolutionFolder> hg pull -f ..\Temp_Project_A C:\SolutionFolder> hg merge C:\SolutionFolder> hg ci -m "merged Project_A repo into main one" (and similar for Project B) C:\>移动解决方案文件夹\Source\Project\u A Temp\u Project\u A C:\>cd临时项目A C:\Temp\u Project\u A>mkdir Source\Project\u A C:\Temp\u Project\u A>hg rename*Source\Project\u A C:\Temp_Project_A>hg ci-m“将所有项目_A文件向下移动,以准备合并回购” C:\Temp\u Project\u A>cd..\SolutionFolder C:\SolutionFolder>hg pull-f..\Temp\u项目 C:\SolutionFolder>hg合并 C:\SolutionFolder>HGCI-m“将项目与回购合并到主项目中” (与项目B类似) 查看中以“可以从完全无关的存储库中提取…”开头的部分

下面是一个具有实际输出的通用示例:

C:\>hg ini repoA C:\>hg ini repoB C:\>cd repoA C:\repoA>echo FOO > foo.txt C:\repoA>hg add adding foo.txt C:\repoA>hg ci -m "added foo in repo A" C:\repoA>cd ..\repoB C:\repoB>echo BAR > bar.txt C:\repoB>hg add adding bar.txt C:\repoB>hg ci -m "added bar in repo B" C:\repoB>cd .. C:\>hg clone repoA combinedRepo updating to branch default 1 files updated, 0 files merged, 0 files removed, 0 files unresolved C:\>cd combinedRepo C:\combinedRepo>hg pull -f ..\repoB pulling from ..\repoB searching for changes warning: repository is unrelated adding changesets adding manifests adding file changes added 1 changesets with 1 changes to 1 files (+1 heads) (run 'hg heads' to see heads, 'hg merge' to merge) C:\combinedRepo>hg merge 1 files updated, 0 files merged, 0 files removed, 0 files unresolved (branch merge, don't forget to commit) C:\combinedRepo>hg ci -m "merged repoB into repoA" C:\combinedRepo>hg gl @ changeset: 2:3d08641554c5 |\ tag: tip | | parent: 0:bc6a6ad6a3e5 | | parent: 1:54dc5af30c7a | | user: j.w. | | date: Fri Mar 25 10:12:32 2011 -0700 | | summary: merged repoB into repoA | | | o changeset: 1:54dc5af30c7a | parent: -1:000000000000 | user: j.w. | date: Fri Mar 25 10:11:43 2011 -0700 | summary: added bar in repo B | o changeset: 0:bc6a6ad6a3e5 user: j.w date: Fri Mar 25 10:11:15 2011 -0700 summary: added foo in repo A C:\>hg-ini-repoA C:\>hg ini报告 C:\>cd repoA C:\repoA>echo FOO>FOO.txt C:\repoA>hg添加 添加foo.txt C:\repoA>hg ci-m“在repoA中添加了foo” C:\repoA>cd..\repoB C:\repoB>echo BAR>BAR.txt C:\repoB>hg添加 添加bar.txt C:\repoB>hg ci-m“在repoB中添加了条” C:\repoB>cd。。 C:\>hg克隆报告A组合报告 更新到分支默认值 1个文件已更新,0个文件已合并,0个文件已删除,0个文件未解析 C:\>cd组合唱片 C:\combinedRepo>hg pull-f..\repoB 正在从..\repoB拉出 搜索更改 警告:存储库不相关 添加变更集 添加舱单 添加文件更改 添加了1个更改集,其中1个更改为1个文件(+1个头) (运行“hg头”查看头,“hg合并”合并) C:\CombinedReporto>hg合并 1个文件已更新,0个文件已合并,0个文件已删除,0个文件未解析 (分支合并,不要忘记提交) C:\CombinedReporto>HGCI-m“将repoB合并到repoA” C:\CombinedReporto>hg gl @变更集:2:3d08641554c5 |\标签:提示 ||父项:0:bc6a6ad6a3e5 ||家长:1:54dc5af30c7a ||用户:j.w。 |日期:2011年3月25日星期五10:12:32-0700 ||总结:将repoB合并为repoA | | |o变更集:1:54dc5af30c7a |父项:-1:000000000000 |用户:j.w。 |日期:2011年3月25日星期五10:11:43-0700 |摘要:在回购协议B中添加了条 | o变更集:0:bc6a6ad6a3e5 用户:j.w 日期:2011年3月25日星期五10:11:15-0700 摘要:在回购协议A中添加了foo
嗯,这里的文档看起来很有希望:在“重命名”部分我将在下面添加两个答案,因为有两种不同的方法可以做到这一点,我可以想到哪种方法比你在维基上找到的方法更好。你可能想检查一下这个非常类似的问题:是的,我忘了这个,谢谢你的提醒。我八个月前就用过,效果很好。 C:\>hg ini repoA C:\>hg ini repoB C:\>cd repoA C:\repoA>echo FOO > foo.txt C:\repoA>hg add adding foo.txt C:\repoA>hg ci -m "added foo in repo A" C:\repoA>cd ..\repoB C:\repoB>echo BAR > bar.txt C:\repoB>hg add adding bar.txt C:\repoB>hg ci -m "added bar in repo B" C:\repoB>cd .. C:\>hg clone repoA combinedRepo updating to branch default 1 files updated, 0 files merged, 0 files removed, 0 files unresolved C:\>cd combinedRepo C:\combinedRepo>hg pull -f ..\repoB pulling from ..\repoB searching for changes warning: repository is unrelated adding changesets adding manifests adding file changes added 1 changesets with 1 changes to 1 files (+1 heads) (run 'hg heads' to see heads, 'hg merge' to merge) C:\combinedRepo>hg merge 1 files updated, 0 files merged, 0 files removed, 0 files unresolved (branch merge, don't forget to commit) C:\combinedRepo>hg ci -m "merged repoB into repoA" C:\combinedRepo>hg gl @ changeset: 2:3d08641554c5 |\ tag: tip | | parent: 0:bc6a6ad6a3e5 | | parent: 1:54dc5af30c7a | | user: j.w. | | date: Fri Mar 25 10:12:32 2011 -0700 | | summary: merged repoB into repoA | | | o changeset: 1:54dc5af30c7a | parent: -1:000000000000 | user: j.w. | date: Fri Mar 25 10:11:43 2011 -0700 | summary: added bar in repo B | o changeset: 0:bc6a6ad6a3e5 user: j.w date: Fri Mar 25 10:11:15 2011 -0700 summary: added foo in repo A