情况
我有两个 .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
存储库中。
根据这个页面(这实际上是我在 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
和.../Libraries/ProjectB
) 更新为修订版 7 中存储的任何内容好?
更新
我添加了第 8 行代码:ci -m "initial commit"
. 这做了两件事:(1) 将 .hgsubstate 文件添加到主存储库和 (2) 提交所有更改,包括新的子存储库到主存储库(带有消息“初始提交”)。.hgsubstate 文件的目的是跟踪所有子存储库的状态,因此如果您返回到较早的修订版,它也会从所有子存储库中获取正确的修订版。
更新 2 - 一些说明
经过进一步的实验,我想我现在可以提供解决我原来问题的步骤(主要使用 Windows Explorer 和 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 操作(尤其是更新)编写批处理文件。
希望这对将来的某人有所帮助。如果您发现任何错误,请告诉我(或者如果可以,请随时自行编辑)。