Mercurial Subrepos - 您如何创建它们以及它们如何工作? [英] Mercurial Subrepos - How do you create them and how do they work?
问题描述
情况
我有两个 .NET 解决方案(Foo
和 Bar
)和一个包含 ProjectA、ProjectB 和 ProjectC 的公共库.Foo
和 Bar
引用一个或多个库项目,但库项目不在 Foo
和 Bar
内解决方案文件夹.
目录结构:
-- 我的文档*- 发展-- 图书馆-- 项目A-- 项目B-- 项目C-- 项目-- 傅- 解决方案-- .hg-- .hgignore-- Foo { 项目文件夹 }-- FooTests { 项目文件夹}-- Foo.sln { 引用 ProjectA }-- 佛囧- 酒吧- 解决方案-- .hg-- .hgignore-- 栏 { 项目文件夹 }-- BarTests { 项目文件夹 }-- Bar.sln { 引用 ProjectA 和 ProjectB }——巴索
*唉,我还在使用 Windows XP...
Mercurial 子存储库
目标 - 我想设置子存储库,以便我可以在我的 Foo
和 Bar
中存储任何引用库项目的源代码存储库.
根据这个页面(实际上这是我能找到的唯一文档subrepos),设置子仓库需要从 DOS 控制台窗口执行以下命令:
<代码>1|$ hg 初始化主2|$ cd 主3|$ hg init 嵌套4|$回声测试>嵌套/富5|$ hg -R 嵌套添加嵌套/foo6|$ echo 嵌套 = 嵌套 >.hgsub7|$ hg 添加 .hgsub8|$ ci -m "初始提交"
问题
- 从版本 0.9.2 开始,可以使用 TortoiseHG 执行任何或所有这些步骤吗?如果是,如何?我很确定第 1-3 行可以,但我不知道第 4-7 行.TortoiseHG 中似乎没有记录这些内容.
- 上面的代码做了什么(逐行解释将不胜感激).以下是我在试图破译它时想到的一些具体问题:
>
有什么作用?我尝试在 Mercurial 文档中搜索>
,但没有找到任何内容.- 在第 5 行,我不明白
nested/foo
是什么.foo
是从哪里来的?什么是foo
?一个存储库?文件夹? - 第 6 行 - 这让我完全困惑.
- 在第 7 行,我假设
.hgsub
被添加到main
?或者它是否被添加到nested
中?
- 假设我设置了我的子存储库,并且我的
Bar
存储库现在已达到修订版 10.如果我尝试将我的工作目录更新到修订版 7,这是否会导致我的库文件夹(My Documents/Development/Libraries/ProjectA
和.../Libraries/ProjectB
) 以更新到修订版 7 中存储的任何内容?
更新
我添加了第 8 行代码:ci -m "initial commit"
.这做了两件事:(1)向主存储库添加一个 .hgsubstate 文件,(2)提交所有更改,包括新的子存储库到主存储库(带有消息初始提交")..hgsubstate 文件的目的是跟踪所有子存储库的状态,因此如果您返回到较早的修订版,它也会从所有子存储库中获取正确的修订版.
更新 2 - 一些说明
经过进一步的实验,我认为我现在可以提供解决原始问题的步骤(主要使用 Windows 资源管理器和 TortoiseHG):
创建子仓库
Libraries/ProjectA
、Libraries/ProjectB
和主要存储库(Projects/Foo/Solution
和Projects/Bar/解决方案
) 必须是单独的存储库.- 打开
Projects/Foo/Solution
. - 从
Libraries/ProjectA
克隆到Projects/Foo/Solution
. - 将
ProjectA
添加到Foo
存储库. 使用文本编辑器创建一个名为
.hgsub
的文件,其中包含以下内容:ProjectA = ProjectA
打开 DOS 控制台窗口并输入以下命令(请参阅下面的注释):
cd c:...ProjectsFooSolutionhg ci -m "提交子仓库 "ProjectA"
对于
Bar
,步骤基本相同,只是 .hgsub 文件应该包含两个项目的条目,如下所示:ProjectA = ProjectA项目 B = 项目 B
注意:从 TortoiseHG 0.10(定于 3 月发布)开始,您将能够使用 HG Commit
shell 命令来执行此操作,但现在,你必须使用命令行.
一旦这一切都设置好了,事情就会变得容易一些.
提交更改 - 要提交对 Foo
或 Bar
的更改,您需要执行 Synchronize/Pull
操作每个子仓库使子仓库与库项目存储库中的最新修订同步.然后您再次使用命令行提交更改(直到 0.10 版本,您只能使用 TortoiseHG 提交).
将工作目录更新到较早的版本 - 这似乎与 TortoiseHG 一起正常工作,并且似乎不需要使用任何 DOS 命令.要在 Visual Studio 中实际使用早期版本,您需要执行 Synchronize/Push
操作以将旧版本的库项目放回 Libraries/ProjectX
文件夹.
尽管我喜欢 TortoiseHG 用于简单的任务,但为经常使用的 subrepo 操作(尤其是更新)编写批处理文件可能更好.
希望这对未来的人有所帮助.如果您发现任何错误,请告诉我(如果可以,请随时自行编辑).
你可能可以尝试一下这些东西,并且比写下你的问题更快地学会它,但我会咬一口.
<块引用>这些步骤中的任何一个或所有步骤都可以与 TortoiseHG 一起执行,截至版本 0.9.2?如果是,如何?
TortiseHG 还没有在子存储库创建周围放置 GUI 包装器,但 TortiseHG 在使用命令行方面一直做得很好.使用命令行创建它们,你就可以开始了.
<块引用>有什么作用上面的代码做(一行一行的解释会很多赞赏).
hg init main # 创建主仓库cd main # 进入主仓库hg init nested # 创建嵌套.内部回购回声测试>Nested/foo # 将 test 一词放入嵌套 repo 中的文件 foo 中hg -R nested add nested/foo # 在文件 foo 的嵌套 repo 中添加回声嵌套 = 嵌套 >.hgsub # 将字符串nested =nested"放入名为 .hgsub 的文件(在主文件中)hg add .hgsub # 将文件 .hgsub 添加到主仓库中
<块引用>
这里有一些具体的像我一样想到的问题试图破译它: > 做什么?
这与 mercurial 无关,它是标准 shell(unix 和 dos),用于将结果放入名为 X 的文件中"
<块引用>在第 5 行,我没有了解嵌套/foo 是什么.在哪里foo 是从哪里来的?什么是富?一个存储库?一个文件夹?
这是子仓库中的一个文件.foo 是传统的任意名称,任意内容为字符串test"
<块引用>第 6 行 - 这个一个完全让我困惑.
它把内容放在 .hgsub 中,有必要说嵌套是一个名为嵌套的嵌套存储库,位于嵌套.
<块引用>在第 7 行,我假设 .hgsub 被添加到主要的?还是被添加到嵌套中?
主要
<块引用>假设我设置了子存储库,我的 Bar 存储库现在已达到修订版 10. 如果我尝试更新到修订版 7,这会不会导致我的图书馆文件夹(我的文档/开发/库/项目A和 .../Libraries/ProjectB) 更新存储在修订版 7 中的任何内容好?鉴于 Foo 也指图书馆/项目A,这可以得到有趣!
修订号不会传递,但您可以通过编辑 .hgsubstate 文件进行控制.
Situation
I have two .NET solutions (Foo
and Bar
) and a common library that contains ProjectA, ProjectB, and ProjectC. Foo
and Bar
reference one or more library projects, but the library projects are not located within the Foo
and Bar
Solution folders.
Directory structure:
-- 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
*alas, I'm still using Windows XP...
Mercurial Subrepositories
Goal - I want to set up subrepos so that I can store the source code for any referenced library projects in my Foo
and Bar
repositories.
According to this page (which is literally the only documentation I can find on subrepos), setting up a subrepo requires executing the following commands from a DOS console window:
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"
Questions
- Can any or all of these steps be executed with TortoiseHG, as of version 0.9.2? If yes, how? I'm pretty sure lines 1-3 can, but I don't know about lines 4-7. None of this seems to be documented in TortoiseHG.
- What does the above code do (a line-by-line explanation would be much appreciated). Here are some specific questions that came to mind as I was trying to decipher it:
- What does
>
do? I tried searching through the Mercurial docs for>
, but didn't find anything. - In line 5, I don't understand what
nested/foo
is. Where didfoo
come from? What isfoo
? A repository? A folder? - Line 6 - this one completely baffles me.
- In line 7, I assume
.hgsub
is being added tomain
? Or is it being added tonested
?
- What does
- Let's say I get my subrepos set up, and my
Bar
repository is now up to revision 10. If I attempt to update my working directory to revision 7, will this cause my library folders (My Documents/Development/Libraries/ProjectA
and.../Libraries/ProjectB
) to update to whatever is stored in revision 7 as well?
Update
I added an 8th line of code: ci -m "initial commit"
. This does two things: (1) adds a .hgsubstate file to the main repo and (2) commits all changes, including the new subrepo into the main repository (with message "initial commit"). The purpose of the .hgsubstate file is to keep track of the state of all subrepos, so if you return to an earlier revision, it will grab the correct revision from all subrepos as well.
Update 2 - some instructions
After further experimentation, I think I can now provide the steps to solve my original problem (using mostly Windows Explorer and TortoiseHG):
Creating a subrepo
Libraries/ProjectA
,Libraries/ProjectB
, and the main repositories (Projects/Foo/Solution
andProjects/Bar/Solution
) must be separate repositories.- Open
Projects/Foo/Solution
. - Clone from
Libraries/ProjectA
toProjects/Foo/Solution
. - Add
ProjectA
to theFoo
repository. Use a text editor to create a file called
.hgsub
, containing the following:ProjectA = ProjectA
Open a DOS console window and enter the following commands (see note below):
cd c:...ProjectsFooSolution hg ci -m "Committing subrepo "ProjectA"
For
Bar
, the steps are basically the same, except the .hgsub file should contain entries for both projects, like this:ProjectA = ProjectA ProjectB = ProjectB
Note: starting with TortoiseHG 0.10 (which is slated for March), you will be able to use the HG Commit
shell command to do this, but for now, you have to use the command line.
Once this is all set up, it gets a little easier.
Committing changes - to commit changes to Foo
or Bar
, you do a Synchronize/Pull
operation for each subrepo to get the subrepos in sync with the latest revisions in the library project repositories. Then you again use the command line to commit the changes (until version 0.10, when you can just use TortoiseHG to commit).
Updating working directory to an earlier revision - This seems to work pretty normally with TortoiseHG and doesn't seem to require use of any DOS commands. To actually work with the earlier revision in Visual Studio, you will need to do a Synchronize/Push
operation to put the older version of the library projects back into the Libraries/ProjectX
folder.
As much as I like TortoiseHG for simple tasks, it's probably better to write batch files for frequently used subrepo operations (especially updating).
Hope this helps someone in the future. If you see any mistakes, please let me know (or feel free to edit yourself if you are able).
You could probably try this stuff out and learn it more quickly than writing up your question took, but I'll bite.
Can any or all of these steps be executed with TortoiseHG, as of version 0.9.2? If yes, how?
TortiseHG doesn't yet put GUI wrappers around sub-repo creation, but TortiseHG has always done a great job of working with the command line. Use the command line to create and them and you're good to go.
What does the above code do (a line-by-line explanation would be much appreciated).
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
Here are some specific questions that came to mind as I was trying to decipher it: What does > do?
That has nothing to do with mercurial it's standard shell (unix and dos) for "put the result into a file named X"
In line 5, I don't understand what nested/foo is. Where did foo come from? What is foo? A repository? A folder?
It's a file in the subrepo. Foo is a traditional arbitrary name, and the arbitrary contents are the string "test"
Line 6 - this one completely baffles me.
It's putting the contents in .hgsub necessary to say that nested is a nested repo named nested and located at nested.
In line 7, I assume .hgsub is being added to main? Or is it being added to nested?
main
Let's say I get my subrepos set up, and my Bar repository is now up to revision 10. If I attempt to update to revision 7, will this cause my library folders (My Documents/Development/Libraries/ProjectA and .../Libraries/ProjectB) to update to whatever is stored in revision 7 as well? Given that Foo also refers to Libraries/ProjectA, this could get interesting!
Revision numbers won't carry across, but you have control by editing the .hgsubstate file.
这篇关于Mercurial Subrepos - 您如何创建它们以及它们如何工作?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!