4

I started two disparate projects in Visual Studio 2010, each with their own hg repository.

Later I decided that the two projects belonged under one solution, and thus one hg repository.

The new solution the following file structure:

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

Is there a way that I can merge Project_A's and Project_B's changesets into the solution folder's repository?

Thus resulting in:

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

With all of the changesets from Project_A's and Project_B's landing in the SolutionFolder's repository?

4

3 回答 3

3

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

为此,您只需 cd 进入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中执行大多数正常的 Mercurial 命令,它们将向下级联到子存储库中。commit--subrepos

于 2011-03-25T16:54:17.733 回答
3

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

创建文本文件,我们将在其中将其称为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

让您准确地了解您的问题目标,以及所有历史记录和跟踪的所有内容。也就是说,请参阅我的其他答案,了解我认为更好的主意。

于 2011-03-25T16:47:24.697 回答
0

一种方法是从不相关的 repo 中提取,使用hg pull -f. 这将导致一个具有多个根的存储库。您仍将拥有来自两个存储库的历史记录,这将由存储库中的两条开发线表示。

这里唯一的技巧是让目录结构正确。您希望合并回购的根以匹配合并回购的根。

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

    C:\> 移动 SolutionFolder\Source\Project_A Temp_Project_A
    C:\> cd Temp_Project_A
    C:\Temp_Project_A> mkdir 源\Project_A
    C:\Temp_Project_A> hg 重命名 * 源\Project_A
    C:\Temp_Project_A> hg ci -m "下移所有 Project_A 文件以准备合并 repos"
    C:\Temp_Project_A> cd ..\SolutionFolder
    C:\SolutionFolder> hg pull -f ..\Temp_Project_A
    C:\SolutionFolder> hg 合并
    C:\SolutionFolder> hg ci -m "merged Project_A repo into main one"

    (与项目 B 类似)

查看Mercurial Wiki中以“可以从完全不相关的存储库中提取...”开头的部分

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

    C:\>hg ini repoA

    C:\>hg ini repoB

    C:\>cd repoA

    C:\repoA>echo FOO > foo.txt

    C:\repoA>hg 添加
    添加 foo.txt

    C:\repoA>hg ci -m "在 repo A 中添加了 foo"

    C:\repoA>cd ..\repoB

    C:\repoB>echo BAR > bar.txt

    C:\repoB>hg 添加
    添加 bar.txt

    C:\repoB>hg ci -m "在 repo B 中添加栏"

    C:\repoB>cd ..

    C:\>hg clone repoA combinedRepo
    更新到分支默认值
    1 个文件已更新,0 个文件已合并,0 个文件已删除,0 个文件未解决

    C:\>cd 组合回购

    C:\combinedRepo>hg pull -f ..\repoB
    从 ..\repoB 拉
    寻找变化
    警告:存储库不相关
    添加变更集
    添加清单
    添加文件更改
    添加了 1 个变更集,对 1 个文件进行了 1 个更改(+1 个头)
    (运行 'hg heads' 来查看头部,'hg merge' 来合并)

    C:\combinedRepo>hg 合并
    1 个文件已更新,0 个文件已合并,0 个文件已删除,0 个文件未解决
    (分支合并,别忘了提交)

    C:\combinedRepo>hg ci -m "将 repoB 合并到 repoA"

    C:\combinedRepo>hg gl
    @变更集:2:3d08641554c5
    |\ 标签:小费
    | | 父:0:bc6a6ad6a3e5
    | | 父母:1:54dc5af30c7a
    | | 用户:jw
    | | 日期:2011年3月25日星期五10:12:32 -0700
    | | 摘要:将 repoB 合并到 repoA
    | |
    | o 变更集:1:54dc5af30c7a
    | 父:-1:000000000000
    | 用户:jw
    | 日期:2011年3月25日星期五10:11:43 -0700
    | 摘要:在回购 B 中添加栏
    |
    o 变更集:0:bc6a6ad6a3e5
       用户:jw
       日期:2011 年 3 月 25 日星期五 10:11:15 -0700
       摘要:在 repo A 中添加了 foo
于 2011-03-25T17:15:21.267 回答