【问题标题】:Mercurial Subrepos - How do you create them and how do they work?Mercurial Subrepos - 你如何创建它们以及它们是如何工作的?
【发布时间】:2011-01-06 04:55:12
【问题描述】:

情况

我有两个 .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 存储库中。

根据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"

问题

  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 和 @987654342 @) 以更新到版本 7 中存储的任何内容?

更新

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


更新 2 - 一些说明

经过进一步的实验,我认为我现在可以提供解决我最初问题的步骤(主要使用 Windows 资源管理器和 TortoiseHG):

创建子仓库

  1. Libraries/ProjectALibraries/ProjectB 和主存储库(Projects/Foo/SolutionProjects/Bar/Solution)必须是单独的存储库。
  2. 打开Projects/Foo/Solution
  3. Libraries/ProjectA 克隆到Projects/Foo/Solution
  4. ProjectA 添加到Foo 存储库。
  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 Commit shell 命令来执行此操作,但现在,您必须使用命令行。

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

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

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

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

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

【问题讨论】:

    标签: version-control mercurial tortoisehg subrepos


    【解决方案1】:

    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 资源管理器中的每个目录添加了一个“在此处打开命令窗口”上下文菜单条目,从而可以在任何需要它们的地方轻松打开命令窗口。

    【讨论】:

    • 使用您喜欢的文本编辑器创建文件,然后在另存为时,您可以将其命名为 .hgsub。
    • 是的,但还是很烦人。而不是仅仅在您已经打开的资源管理器窗口中创建文件(因为您使用的是 TortoiseHg),您必须启动另一个程序,编写内容,最重要的是,在编辑器文件对话框中再次找到该位置。就个人而言,我在我接触的每台机器上都安装了“Command Prompt Here”PowerToy,所以只使用命令行来创建文件就容易多了。
    • 快速提示:如果您使用的是 Windows 7,则无需安装任何东西,只需 Shift+右键单击并选择“在此处打开命令窗口”
    【解决方案2】:

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

    这些步骤中的任何一个或全部可以是 用 TortoiseHG 执行,截至 0.9.2 版?如果是,怎么做?

    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 行,我没有 了解嵌套/foo 是什么。在哪里 foo 是从哪里来的?什么是富?一种 存储库?一个文件夹?

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

    第 6 行 - 这个 一个完全让我困惑。

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

    在第 7 行, 我假设 .hgsub 被添加到 主要的?还是被添加到嵌套中?

    主要

    假设我设置了我的子存储库, 我的酒吧存储库现在最多 修订版 10. 如果我尝试更新到 修订版 7,这会导致我的图书馆 文件夹(我的 文件/开发/图书馆/ProjectA 和 .../Libraries/ProjectB) 进行更新 对于存储在修订版 7 中的任何内容 好吧?鉴于 Foo 还指 图书馆/ProjectA,这可以得到 有趣!

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

    【讨论】:

      猜你喜欢
      • 2013-08-04
      • 1970-01-01
      • 2018-01-25
      • 2013-06-16
      • 2016-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-25
      相关资源
      最近更新 更多