使用hg将不同的项目与存储库合并到一个解决方案中?

时间:2011-03-25 15:24:58

标签: visual-studio-2010 mercurial merge projects-and-solutions changeset

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

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

新解决方案具有以下文件结构:

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

我是否有办法将merge Project_AProject_B的更改集添加到解决方案文件夹的存储库中?

因此导致:

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

Project_AProject_B的所有变更集是否已登陆SolutionFolder的存储库?

3 个答案:

答案 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