36

情况

我有两个 .NET 解决方案(FooBar)和一个包含 ProjectA、ProjectB 和 ProjectC 的公共库。FooBar引用一个或多个库项目,但库项目不位于FooBar解决方案文件夹中。

目录结构:

-- 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 子存​​储库

目标- 我想设置子存​​储库,以便我可以将任何引用的库项目的源代码存储在我的存储库FooBar存储库中。

根据这个页面(这实际上是我在 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"

问题

  1. 从版本 0.9.2 开始,是否可以使用 TortoiseHG 执行任何或所有这些步骤?如果是,如何?我很确定第 1-3 行可以,但我不知道第 4-7 行。这些似乎都没有记录在 TortoiseHG 中。
  2. 上面的代码做了什么(非常感谢逐行解释)。以下是我试图破译它时想到的一些具体问题:
    • 做什么>?我尝试在 Mercurial 文档中搜索>,但没有找到任何东西。
    • 在第 5 行,我不明白是什么nested/foo。是从哪里来foo的?是什么foo?存储库?一个文件夹?
    • 第 6 行 - 这完全让我感到困惑。
    • 在第 7 行,我假设.hgsub正在添加到main? 还是被添加到nested?
  3. 假设我设置了子存储库,并且我的Bar存储库现在已更新到修订版 10。如果我尝试将工作目录更新到修订版 7,这是否会导致我的库文件夹 (My Documents/Development/Libraries/ProjectA.../Libraries/ProjectB) 更新为修订版 7 中存储的任何内容好?

更新

我添加了第 8 行代码:ci -m "initial commit". 这做了两件事:(1) 将 .hgsubstate 文件添加到主存储库和 (2) 提交所有更改,包括新的子存储库到主存储库(带有消息“初始提交”)。.hgsubstate 文件的目的是跟踪所有子存储库的状态,因此如果您返回到较早的修订版,它也会从所有子存储库中获取正确的修订版。


更新 2 - 一些说明

经过进一步的实验,我我现在可以提供解决我原来问题的步骤(主要使用 Windows Explorer 和 TortoiseHG):

创建一个子仓库

  1. Libraries/ProjectA, Libraries/ProjectB, 和主存储库 (Projects/Foo/SolutionProjects/Bar/Solution) 必须是单独的存储库。
  2. 打开Projects/Foo/Solution.
  3. 克隆Libraries/ProjectAProjects/Foo/Solution.
  4. 添加ProjectAFoo存储库。
  5. 使用文本编辑器创建一个名为 的文件.hgsub,其中包含以下内容:

    ProjectA = ProjectA
    
  6. 打开一个 DOS 控制台窗口并输入以下命令(见下面的注释)

    cd c:\...\Projects\Foo\Solution
    hg ci -m "Committing subrepo "ProjectA"
    
  7. 对于Bar,步骤基本相同,除了 .hgsub 文件应包含两个项目的条目,如下所示:

    ProjectA = ProjectA  
    ProjectB = ProjectB
    

注意:从 TortoiseHG 0.10(定于 3 月发布)开始,您将能够使用HG Commitshell 命令来执行此操作,但现在,您必须使用命令行。

一旦这一切都设置好了,它会变得更容易一些。

提交更改- 提交更改FooBar,您Synchronize/Pull为每个子存储库执行操作以使子存储库与库项目存储库中的最新修订同步。然后你再次使用命令行提交更改(直到版本 0.10,你可以只使用 TortoiseHG 提交)。

将工作目录更新到较早的版本- 这似乎与 TortoiseHG 一起正常工作,并且似乎不需要使用任何 DOS 命令。要在 Visual Studio 中实际使用早期版本,您需要执行Synchronize/Push操作以将较旧版本的库项目放回Libraries/ProjectX文件夹中。

尽管我喜欢 TortoiseHG 用于简单的任务,但最好为经常使用的 subrepo 操作(尤其是更新)编写批处理文件。

希望这对将来的某人有所帮助。如果您发现任何错误,请告诉我(或者如果可以,请随时自行编辑)。

4

2 回答 2

20

您可能可以尝试这些东西并比写下您的问题更快地学习它,但我会咬一口。

从版本 0.9.2 开始,是否可以使用 TortoiseHG 执行任何或所有这些步骤?如果是,如何?

TortiseHG 还没有围绕子存储库的创建放置 GUI 包装器,但是 TortiseHG 在使用命令行方面一直做得很好。使用命令行创建它们,一切顺利。

上面的代码做了什么(非常感谢逐行解释)。

hg init main  # creates the main repo
cd main # enter the main repo
hg init nested # create the nested. internal repo
echo test > nested/foo # put the word test into the file foo in the nested repo
hg -R nested add nested/foo # do an add in the nested repo of file foo
echo nested = nested > .hgsub # put the string "nested = nested" into a file (in main) named .hgsub
hg add .hgsub # add the file .hgsub into the main repo

以下是我在试图破译它时想到的一些具体问题: > 做什么?

这与 mercurial 无关,它是标准 shell(unix 和 dos),用于“将结果放入名为 X 的文件中”

在第 5 行,我不明白 nested/foo 是什么。foo 是从哪里来的?什么是富?存储库?一个文件夹?

这是子仓库中的一个文件。Foo是传统的任意名称,任意内容为字符串“test”

第 6 行 - 这完全让我感到困惑。

它将内容放在 .hgsub 中,有必要说nested 是一个名为nested 的嵌套repo,位于nested。

在第 7 行,我假设 .hgsub 被添加到 main? 或者它被添加到嵌套中?

主要的

假设我设置了子存储库,并且我的 Bar 存储库现在已更新到修订版 10。如果我尝试更新到修订版 7,这是否会导致我的库文件夹(我的文档/开发/库/ProjectA 和 .../Libraries /ProjectB) 更新到版本 7 中存储的任何内容?鉴于 Foo 还指的是库/ProjectA,这可能会变得有趣!

修订号不会传递,但您可以通过编辑 .hgsubstate 文件进行控制。

于 2010-01-18T05:22:46.250 回答
6

只是一个快速更新,在 TortoiseHg 1.0 发布之后。

THG 1 中的 subrepo 支持足以让您从 Windows 资源管理器执行示例步骤。我唯一不能从 Explorer 做的是第 6 步:

echo nested = nested > .hgsub

Windows 资源管理器(至少在 XP 中)报告重命名错误“您必须键入文件名”。如果您尝试将“New Text Document.txt”重命名为“.hgsub”。*8')

编辑:顺便说一句,如果您通过 TortoiseHg 和命令行同时使用 hg,并且您还没有安装 Microsoft 的“Command Here” PowerTool,我强烈推荐它。它将“在此处打开命令窗口”上下文菜单条目添加到 Windows 资源管理器中的每个目录,从而可以在任何需要它们的地方轻松打开命令窗口。

于 2010-03-29T19:12:24.183 回答