【发布时间】:2011-01-06 04:55:12
【问题描述】:
情况
我有两个 .NET 解决方案(Foo 和 Bar)和一个包含 ProjectA、ProjectB 和 ProjectC 的公共库。 Foo 和 Bar 引用一个或多个库项目,但库项目不在 Foo 和 Bar 解决方案文件夹中。
目录结构:
-- My Documents*
-- Development
-- Libraries
-- ProjectA
-- ProjectB
-- ProjectC
-- Projects
-- Foo
-- Solution
-- .hg
-- .hgignore
-- Foo { Project Folder }
-- FooTests { Project Folder }
-- Foo.sln { References ProjectA }
-- Foo.suo
-- Bar
-- Solution
-- .hg
-- .hgignore
-- Bar { Project Folder }
-- BarTests { Project Folder }
-- Bar.sln { References ProjectA and ProjectB }
-- Bar.suo
*唉,我还在用 Windows XP...
Mercurial 子存储库
目标 - 我想设置子存储库,以便我可以将任何引用的库项目的源代码存储在我的 Foo 和 Bar 存储库中。
根据this page(这是我在 subrepos 上能找到的唯一文档),设置 subrepo 需要从 DOS 控制台窗口执行以下命令:
1| $ hg init main
2| $ cd main
3| $ hg init nested
4| $ echo test > nested/foo
5| $ hg -R nested add nested/foo
6| $ echo nested = nested > .hgsub
7| $ hg add .hgsub
8| $ ci -m "initial commit"
问题
- 从 0.9.2 版开始,是否可以使用 TortoiseHG 执行任何或所有这些步骤?如果是,如何?我很确定第 1-3 行可以,但我不知道第 4-7 行。 TortoiseHG 中似乎没有记录这些内容。
- 上面的代码做了什么(非常感谢逐行解释)。以下是我试图破译它时想到的一些具体问题:
-
>有什么作用?我尝试在 Mercurial 文档中搜索>,但没有找到任何东西。 - 在第 5 行,我不明白
nested/foo是什么。foo是从哪里来的?foo是什么?存储库?文件夹? - 第 6 行 - 这完全让我感到困惑。
- 在第 7 行,我假设
.hgsub被添加到main?还是被添加到nested?
-
- 假设我设置了子存储库,并且我的
Bar存储库现在已达到修订版 10。如果我尝试将工作目录更新到修订版 7,这是否会导致我的库文件夹(My Documents/Development/Libraries/ProjectA和 @987654342 @) 以更新到版本 7 中存储的任何内容?
更新
我添加了第 8 行代码:ci -m "initial commit"。这做了两件事:(1) 将 .hgsubstate 文件添加到主存储库和 (2) 提交所有更改,包括新的子存储库到主存储库(带有消息“初始提交”)。 .hgsubstate 文件的目的是跟踪所有子存储库的状态,因此如果您返回到较早的修订版,它也会从所有子存储库中获取正确的修订版。
更新 2 - 一些说明
经过进一步的实验,我认为我现在可以提供解决我最初问题的步骤(主要使用 Windows 资源管理器和 TortoiseHG):
创建子仓库
-
Libraries/ProjectA、Libraries/ProjectB和主存储库(Projects/Foo/Solution和Projects/Bar/Solution)必须是单独的存储库。 - 打开
Projects/Foo/Solution。 - 从
Libraries/ProjectA克隆到Projects/Foo/Solution。 - 将
ProjectA添加到Foo存储库。 -
使用文本编辑器创建一个名为
.hgsub的文件,其中包含以下内容:ProjectA = ProjectA -
打开一个 DOS 控制台窗口并输入以下命令(见下面的注释):
cd c:\...\Projects\Foo\Solution hg ci -m "Committing subrepo "ProjectA" -
对于
Bar,步骤基本相同,只是 .hgsub 文件应包含两个项目的条目,如下所示:ProjectA = ProjectA ProjectB = ProjectB
注意:从 TortoiseHG 0.10(计划于 3 月发布)开始,您将能够使用 HG Commit shell 命令来执行此操作,但现在,您必须使用命令行。
一旦这一切都设置好了,它就会变得容易一些。
提交更改 - 要将更改提交到 Foo 或 Bar,请为每个子存储库执行 Synchronize/Pull 操作,以使子存储库与库项目存储库中的最新修订保持同步.然后你再次使用命令行提交更改(直到版本 0.10,你可以只使用 TortoiseHG 提交)。
将工作目录更新到较早的版本 - 这似乎与 TortoiseHG 正常工作,并且似乎不需要使用任何 DOS 命令。要在 Visual Studio 中实际使用早期版本,您需要执行 Synchronize/Push 操作,将旧版本的库项目放回 Libraries/ProjectX 文件夹中。
尽管我喜欢 TortoiseHG 用于简单的任务,但为经常使用的 subrepo 操作(尤其是更新)编写批处理文件可能会更好。
希望这对将来的某人有所帮助。如果您发现任何错误,请告诉我(或者如果可以,请随时自行编辑)。
【问题讨论】:
标签: version-control mercurial tortoisehg subrepos