【问题标题】:Merging disparate projects with repositories into a single solution with hg?使用 hg 将不同的项目与存储库合并到一个解决方案中?
【发布时间】:2011-03-25 15:24:57
【问题描述】:

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

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

新的解决方案如下文件结构:

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

有没有办法可以将mergeProject_AProject_B 的变更集放入解决方案文件夹的存储库中?

因此导致:

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

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

【问题讨论】:

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


【解决方案1】:

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

为此,您只需 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'

之后,您可以在解决方案文件夹(statuscommit 等)中使用附加的 --subrepos 参数执行大多数正常的 Mercurial 命令,它们将向下级联到子存储库中。

【讨论】:

  • 是的,我忘记了,谢谢你的提醒。我八个月前用过,效果很好。
【解决方案2】:

如果您可以更改历史记录(即:使其他人对该项目的克隆无效),您可以使用“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

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

【讨论】:

    【解决方案3】:

    您可以使用hg pull -f 发送至pull from an unrelated repo。 这将导致一个具有多个根的存储库。 您仍将拥有来自两个存储库的历史记录,这将由存储库中的两条开发线表示。

    这里唯一的技巧是正确的目录结构。您希望合并存储库的根目录与合并存储库的根目录匹配。

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

    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 文件向下移动以准备合并存储库" 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 | |用户: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 摘要:在 repo A 中添加了 foo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多