Mercurial Subrepos – 你如何创build它们,它们是如何工作的?

情况

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

目录结构:

 -- 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子库

目标 – 我想设置subrepos,以便我可以存储我的FooBar存储库中任何引用的库项目的源代码。

根据这个页面 (这实际上是我可以在subrepos上find的唯一文档),设置一个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行。 这似乎没有logging在TortoiseHG。
  2. 上面的代码做了什么(一行一行的解释将不胜感激)。 当我试图破译它时,下面是一些具体的问题:
    • >做什么? 我试图通过Mercurial文档search> ,但没有find任何东西。
    • 在第5行中,我不明白nested/foo是什么。 foo从哪里来? 什么是foo ? 存储库? 一个文件夹?
    • 第6行 – 这个完全让我感到困惑。
    • 在第7行,我假设.hgsub被添加到main ? 还是被添加到nested
  3. 如果我试图更新我的工作目录到版本7,这会导致我的图书馆文件夹( My Documents/Development/Libraries/ProjectA.../Libraries/ProjectB我得到我的subrepos设置,我的Bar仓库现在达到版本10 .../Libraries/ProjectB )更新到版本7中存储的内容。

更新

我添加了第8行代码: ci -m "initial commit" 。 这样做有两点:(1)将.hgsubstate文件添加到主库,并(2)将所有更改(包括新的子库)提交到主库(带有“初始提交”消息)。 .hgsubstate文件的目的是跟踪所有subrepos的状态,所以如果你返回到以前的版本,它也会从所有的subrepos中获取正确的版本。


更新2 – 一些说明

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

创build一个subrepo

  1. Libraries/ProjectALibraries/ProjectB和主要的软件仓库( Projects/Foo/SolutionProjects/Bar/Solution )必须是独立的仓库。
  2. 打开Projects/Foo/Solution
  3. Libraries/ProjectA复制到Projects/Foo/Solution
  4. ProjectA添加到Foo存储库。
  5. 使用文本编辑器创build一个名为.hgsub的文件,其中包含以下内容:

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

     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操作,以使subrepos与库项目存储库中的最新版本保持同步。 然后你再次使用命令行来提交更改(直到版本0.10,当你可以使用TortoiseHG提交)。

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

就像我喜欢TortoiseHG的简单任务一样,最好为频繁使用的subrepo操作(尤其是更新)编写batch file。

希望这有助于未来的人。 如果您发现任何错误,请告诉我(如果可以,请随时编辑)。

你可以试试这个东西,比写出你的问题更快地学习,但我会咬。

从0.9.2版开始,可以使用TortoiseHG执行这些步骤中的任何一个还是全部? 如果是的话,怎么样?

TortiseHG还没有在子repo的创build中使用GUI包装,但是TortiseHG一直在使用命令行做很棒的工作。 使用命令行来创build它们,你很好。

上面的代码是做什么的(一行一行的解释将不胜感激)。

 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是一个传统的任意名字,任意的内容是string“test”

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

它将内容放在.hgsub中,必须说嵌套是一个名为嵌套的嵌套回购,位于嵌套。

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

主要

如果我试图更新到版本7,这将导致我的库文件夹(我的文档/开发/库/ ProjectA和… /库/ ProjectB)更新到版本7中存储的内容? 鉴于Foo也指图书馆/ ProjectA,这可能会变得有趣!

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

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

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

 echo nested = nested > .hgsub 

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

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