Mercurial Subrepos – 你如何创build它们,它们是如何工作的?
情况
我有两个.NET解决scheme( 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子库
目标 – 我想设置subrepos,以便我可以存储我的Foo
和Bar
存储库中任何引用的库项目的源代码。
根据这个页面 (这实际上是我可以在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"
问题
- 从0.9.2版开始,可以使用TortoiseHG执行这些步骤中的任何一个还是全部? 如果是的话,怎么样? 我很确定第1-3行可以,但我不知道第4-7行。 这似乎没有logging在TortoiseHG。
- 上面的代码做了什么(一行一行的解释将不胜感激)。 当我试图破译它时,下面是一些具体的问题:
- “
>
做什么? 我试图通过Mercurial文档search>
,但没有find任何东西。 - 在第5行中,我不明白
nested/foo
是什么。foo
从哪里来? 什么是foo
? 存储库? 一个文件夹? - 第6行 – 这个完全让我感到困惑。
- 在第7行,我假设
.hgsub
被添加到main
? 还是被添加到nested
?
- “
- 如果我试图更新我的工作目录到版本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
-
Libraries/ProjectA
,Libraries/ProjectB
和主要的软件仓库(Projects/Foo/Solution
和Projects/Bar/Solution
)必须是独立的仓库。 - 打开
Projects/Foo/Solution
。 - 从
Libraries/ProjectA
复制到Projects/Foo/Solution
。 - 将
ProjectA
添加到Foo
存储库。 -
使用文本编辑器创build一个名为
.hgsub
的文件,其中包含以下内容:ProjectA = ProjectA
-
打开DOS控制台窗口并input以下命令(请参阅下面的注释) :
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
操作,以使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理器的每个目录中都会添加一个“在此打开命令窗口”的上下文菜单项,使您可以轻松地在任何需要它们的地方打开命令窗口。