代码之家  ›  专栏  ›  技术社区  ›  devuxer

Mercurial Subrepos-如何创建它们以及它们如何工作?

  •  36
  • devuxer  · 技术社区  · 16 年前

    情况

    我有两个.NET解决方案( Foo Bar )以及包含projectA、projectB和projectC的公共库。 酒吧 引用一个或多个库项目,但库项目不在 酒吧 解决方案文件夹。

    目录结构:

    -- 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…

    汞亚报告

    目标 -我想设置子报表,以便将任何引用的库项目的源代码存储在 酒吧 储存库。

    根据 this page (实际上,这是我在子报告上找到的唯一文档),设置子报告需要从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. 上面的代码是做什么的(一行一行的解释会非常感谢)。以下是我在试图破译时想到的一些具体问题:
      • 什么? > 怎么办?我试着在反复无常的文档中搜索 > 但什么也没找到。
      • 在第五行,我不明白 nested/foo 是。哪里做的 foo 来自哪里?是什么 ?仓库?文件夹?
      • 第六行-这一个完全让我困惑。
      • 我想在第7行 .hgsub 正在将添加到 main ?或者它被添加到 nested ?
    3. 假设我的子报告已经设置好了, 酒吧 存储库现在是第10版。如果我试图将我的工作目录更新到第7版,这会导致我的库文件夹( My Documents/Development/Libraries/ProjectA .../Libraries/ProjectB )更新版本7中存储的内容?

    更新

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


    更新2-部分说明

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

    创建子报表

    1. Libraries/ProjectA , Libraries/ProjectB 以及主要的存储库( Projects/Foo/Solution Projects/Bar/Solution )必须是单独的存储库。
    2. 正常开放 项目/foo/解决方案 .
    3. 克隆自 图书馆/项目A 项目/foo/解决方案 .
    4. 添加 ProjectA 存储库。
    5. 使用文本编辑器创建名为 HGSUB ,包含以下内容:

      ProjectA = ProjectA
      
    6. 打开DOS控制台窗口并输入以下命令 (见下文注释) 以下内容:

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

      ProjectA = ProjectA  
      ProjectB = ProjectB
      

    注: 从TortoiseHg 0.10开始(定于3月),您将能够使用 HG Commit shell命令可以这样做,但现在,您必须使用命令行。

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

    正在提交更改 -将更改提交到 酒吧 你做了 Synchronize/Pull 每个子报告的操作,以使子报告与库项目存储库中的最新版本同步。然后再次使用命令行提交更改(直到0.10版,此时您可以只使用TortoiseHg提交)。

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

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

    希望这对将来的人有所帮助。如果你看到任何错误,请告诉我(如果你有能力的话,也可以随意编辑自己)。

    2 回复  |  直到 8 年前
        1
  •  20
  •   devuxer    16 年前

    你也许可以试试这个东西,比写下你的问题更快地学会它,但我会咬牙的。

    这些步骤中的任何一个或全部 与TortoiseHg一起执行,自 0.9.2版?如果是,怎么做?

    Tortisehg还没有将GUI包装器放在子repo创建上,但是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无关,它是“将结果放入名为x的文件”的标准shell(Unix和DOS)。

    在第5行,我没有 了解嵌套/foo是什么。在哪里? foo是从哪里来的?什么是FO?一 仓库?文件夹?

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

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

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

    在第7行, 我想。hgsub被添加到 主要的?还是将其添加到嵌套中?

    主要的

    假设我的子报告已经设置好了, 我的酒吧储存库现在 修订版10。如果我尝试更新到 第7版,这会导致我的图书馆 文件夹(我的) 文档/开发/库/项目A 和…/libraries/projectb)更新 版本7中存储的内容 好?鉴于foo也指 库/项目A,这可以 有趣!

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

        2
  •  6
  •   Mark Booth    15 年前

    在TortoiseHg1.0发布后,只需快速更新。

    THG 1中的子报告支持非常好,可以让您从Windows资源管理器中执行示例步骤。我唯一不能从Explorer中完成的是第6步:

    echo nested = nested > .hgsub
    

    如果试图将“new text document.txt”重命名为“.hgsub”,Windows资源管理器(至少在XP中)会报告重命名错误“必须键入文件名”。*8’)

    编辑: 顺便说一下,如果您通过tortoisehg和命令行同时使用hg,并且您还没有Microsofts的“command here”。 PowerTool 安装后,我可以强烈推荐。它在Windows资源管理器的每个目录中都添加了一个“open command window here”上下文菜单项,使您可以很容易地在任何需要的地方打开命令窗口。

    推荐文章