[英]Mercurial Subrepos - How do you create them and how do they work?
情况
我有两个.NET解决方案( Foo
和Bar
)和一个包含ProjectA,ProjectB和ProjectC的公共库。 Foo
和Bar
引用一个或多个库项目,但库项目不在Foo
和Bar
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子库
目标 - 我想设置子目录,以便我可以在我的Foo
和Bar
存储库中存储任何引用的库项目的源代码。
根据这个页面 (这是我在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"
问题
>
做什么? 我尝试在Mercurial文档中搜索>
,但没有找到任何内容。 nested/foo
是什么。 foo
来自哪里? 什么是foo
? 存储库? 一个文件夹? .hgsub
被添加到main
? 或者它是否被添加到nested
? Bar
存储库现在达到了修订版10.如果我尝试将我的工作目录更新到版本7,这将导致我的库文件夹( My Documents/Development/Libraries/ProjectA
和.../Libraries/ProjectB
)更新到版本7中存储的内容? 更新
我添加了第8行代码: ci -m "initial commit"
。 这样做有两件事:(1)将.hgsubstate文件添加到主仓库,以及(2)将所有更改提交到主存储库(包括消息“initial commit”)。 .hgsubstate文件的目的是跟踪所有子目录的状态,因此如果返回到早期版本,它也将从所有子目录中获取正确的修订版本。
更新2 - 一些说明
经过进一步的实验,我想我现在可以提供解决原始问题的步骤(主要使用Windows资源管理器和TortoiseHG):
创建子参数
Libraries/ProjectA
, Libraries/ProjectB
和主存储库( Projects/Foo/Solution
和Projects/Bar/Solution
)必须是单独的存储库。 Projects/Foo/Solution
。 Libraries/ProjectA
克隆到Projects/Foo/Solution
。 ProjectA
添加到Foo
存储库。 使用文本编辑器创建名为.hgsub
的文件,其中包含以下内容:
ProjectA = ProjectA
打开DOS控制台窗口并输入以下命令(请参阅下面的注释) :
cd c:\\...\\Projects\\Foo\\Solution hg ci -m "Committing subrepo "ProjectA"
对于Bar
,步骤基本相同,除了.hgsub文件应包含两个项目的条目,如下所示:
ProjectA = ProjectA ProjectB = ProjectB
注意:从TortoiseHG 0.10开始(定于3月),您将能够使用HG Commit
shell命令执行此操作,但是现在,您必须使用命令行。
一旦完成设置,它就会变得容易一些。
提交更改 - 提交对Foo
或Bar
更改,您可以为每个子项执行Synchronize/Pull
操作,以使子项目与库项目存储库中的最新修订同步。 然后再次使用命令行提交更改(直到版本0.10,当您可以使用TortoiseHG提交时)。
将工作目录更新到早期版本 - 这似乎与TortoiseHG一起正常工作,似乎不需要使用任何DOS命令。 若要实际使用Visual Studio中的早期版本,您需要执行“ Synchronize/Push
操作以将旧版本的库项目放回Libraries/ProjectX
文件夹中。
尽管我喜欢TortoiseHG的简单任务,但为常用的subrepo操作(尤其是更新)编写批处理文件可能更好。
希望这可以帮助将来的某个人。 如果您发现任何错误,请告诉我(如果您能够,请随时编辑自己)。
你可能会尝试这些东西并比写下你的问题更快地学习它,但我会咬人。
从版本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行,我不明白嵌套/ foo是什么。 foo来自哪里? 什么是foo? 存储库? 一个文件夹?
它是subrepo中的一个文件。 Foo是一个传统的任意名称,任意内容都是字符串“test”
第6行 - 这个完全让我困惑。
它将内容放在.hgsub中,必须说嵌套是一个嵌套的repo,名为嵌套并位于嵌套状态。
在第7行,我假设.hgsub被添加到main? 或者它是否被添加到嵌套?
主要
假设我设置了subrepos,我的Bar存储库现在达到了修订版10.如果我尝试更新到版本7,这会导致我的库文件夹(My Documents / Development / Libraries / ProjectA和... / Libraries) / ProjectB)更新到版本7中存储的内容? 鉴于Foo也提到了Libraries / ProjectA,这可能会变得有趣!
版本号不会传递,但您可以通过编辑.hgsubstate文件来控制。
在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”上下文菜单条目,使您可以在任何需要的地方打开命令窗口。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.