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

时间:2010-01-18 01:19:30

标签: version-control mercurial tortoisehg subrepos

场合

我有两个.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 Subrepositories

目标 - 我想设置子目录,以便我可以在我的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. 假设我设置了subrepos,我的Bar存储库现在达到了修订版10.如果我尝试将我的工作目录更新到版本7,这会导致我的库文件夹({{1} }和My Documents/Development/Libraries/ProjectA)更新到版本7中存储的内容?
  4. 更新

    我添加了第8行代码:.../Libraries/ProjectB。这样做有两件事:(1)将.hgsubstate文件添加到主仓库,以及(2)将所有更改提交到主存储库(包括消息“initial commit”)。 .hgsubstate文件的目的是跟踪所有子目录的状态,因此如果您返回到早期版本,它也会从所有子目录中获取正确的修订版。


    更新2 - 一些说明

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

    创建子参数

    1. ci -m "initial commit"Libraries/ProjectA和主存储库(Libraries/ProjectBProjects/Foo/Solution)必须是单独的存储库。
    2. 打开Projects/Bar/Solution
    3. Projects/Foo/Solution克隆到Libraries/ProjectA
    4. Projects/Foo/Solution添加到ProjectA存储库。
    5. 使用文本编辑器创建名为Foo的文件,其中包含以下内容:

      .hgsub
    6. 打开DOS控制台窗口并输入以下命令(请参阅下面的注释)

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

      Bar
    8. 注意:从TortoiseHG 0.10(定于3月开始)开始,您将能够使用ProjectA = ProjectA ProjectB = ProjectB shell命令执行此操作,但是现在,您必须使用命令行。

      一旦完成设置,就会变得容易一些。

      提交更改 - 要对HG CommitFoo进行更改,您需要为每个子参数执行Bar操作,以使子目录与最新的同步库项目存储库中的修订。然后再次使用命令行提交更改(直到版本0.10,当你可以使用TortoiseHG提交时)。

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

      就像我喜欢TortoiseHG的简单任务一样,为常用的subrepo操作(特别是更新)编写批处理文件可能更好。

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

2 个答案:

答案 0 :(得分:20)

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

  

可以执行任何或所有这些步骤   与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来自哪里?什么是foo?一个   库?一个文件夹?

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

  

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

它将内容放在.hgsub中,说嵌套是一个嵌套的嵌套repo,名为嵌套,位于嵌套状态。

  

在第7行   我假设正在添加.hgsub   主要?或者它是否被添加到嵌套?

  

假设我设置了subrepos,   我的Bar存储库现在可以了   版本10.如果我尝试更新到   修订版7,这会导致我的图书馆   文件夹(我的   文档/开发/库/项目A   和... / Libraries / ProjectB)进行更新   对于存储在修订版7中的任何内容   好?鉴于Foo也提到了   图书馆/ ProjectA,这可能会得到   有趣!

版本号不会传入,但您可以通过编辑.hgsubstate文件来控制。

答案 1 :(得分:6)

在TortoiseHg 1.0发布后快速更新。

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

echo nested = nested > .hgsub

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

编辑:顺便提一下,如果您通过TortoiseHg和命令行同时使用hg并且您还没有安装微软“Command Here”PowerTool,我强烈推荐它。它在Windows资源管理器中为每个目录添加了一个“Open Command Window Here”上下文菜单条目,使您可以在任何需要的地方打开命令窗口。