Visual studio 2010 使用hg将具有存储库的不同项目合并到单个解决方案中?
我在VisualStudio2010中启动了两个不同的项目,每个项目都有自己的hg存储库 后来我决定这两个项目属于一个解决方案,因此属于一个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
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