我在Visual Studio 2010中启动了两个不同的项目,每个项目都有自己的hg存储库。
后来我决定这两个项目属于一个解决方案,因此属于一个hg存储库。
新解决方案具有以下文件结构:
SolutionFolder
|---.hg
+---Lib
| ∟ dlls
+---Source
| ∟ Project_A
| ∟--.hg
| ∟ Project_B
| ∟--.hg
+---OverarchingSolution.sln
我是否有办法将merge Project_A
和Project_B
的更改集添加到解决方案文件夹的存储库中?
因此导致:
SolutionFolder
|---.hg
+---Lib
| ∟ dlls
+---Source
| ∟ Project_A
| ∟ Project_B
+---OverarchingSolution.sln
Project_A
和Project_B
的所有变更集是否已登陆SolutionFolder的存储库?
答案 0 :(得分:3)
如果你可以改变历史记录(即:使该项目的其他人的克隆无效),你可以使用'convert'扩展名。
创建文本文件,我们将其中的这一行称为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
将您所拥有的确切内容留在您的问题中,以及跟踪所有历史记录和所有内容。也就是说,看看我的其他答案,我认为这是一个更好的主意。
答案 1 :(得分:3)
如果您认为有可能曾希望再次单独使用这两个存储库(即:在不同的解决方案中使用一个而不是另一个解决方案),那么您可以将它们设置为子存储库一个新的顶级存储库。
要做到这一点,你只需要进入SolutionFolder
并创建一个名为.hgsub
的文件,其中包含以下行:
Source/Project_A = Source/Project_A
Source/Project_B = Source/Project_B
然后你运行这些命令(仍在SolutionFolder
中):
hg init
hg add .hgsub
hg commit -m 'new repo with two sub repos'
之后,您可以使用额外的status
参数在解决方案文件夹(commit
,--subrepos
等)中执行大多数正常的Mercurial命令,并将它们级联到子回购。
答案 2 :(得分:0)
一种方法是使用hg pull -f
pull from an unrelated repo Mercurial Wiki。
这将导致存储库具有多个根。
您将仍然拥有两个repos的历史记录,它将由存储库中的两行开发表示。
这里唯一的技巧就是让目录结构正确。您希望合并后的repos的根目录与组合仓库的根目录匹配。
所以对于你的情况,我会想象这样的事情:
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)
查看{{3}}
中的“可以从完全不相关的存储库中取出...”部分以下是实际输出的通用示例:
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