Mercurial Subrepos - 您如何创建它们以及它们如何工作? [英] Mercurial Subrepos - How do you create them and how do they work?

查看:16
本文介绍了Mercurial Subrepos - 您如何创建它们以及它们如何工作?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

情况

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

目录结构:

-- 我的文档*-  发展-- 图书馆-- 项目A-- 项目B-- 项目C-- 项目-- 傅-  解决方案-- .hg-- .hgignore-- Foo { 项目文件夹 }-- FooTests { 项目文件夹}-- Foo.sln { 引用 ProjectA }-- 佛囧-  酒吧-  解决方案-- .hg-- .hgignore-- 栏 { 项目文件夹 }-- BarTests { 项目文件夹 }-- Bar.sln { 引用 ProjectA 和 ProjectB }——巴索

*唉,我还在使用 Windows XP...

Mercurial 子存​​储库

目标 - 我想设置子存​​储库,以便我可以在我的 FooBar 中存储任何引用库项目的源代码存储库.

根据这个页面(实际上这是我能找到的唯一文档subrepos),设置子仓库需要从 DOS 控制台窗口执行以下命令:

<代码>1|$ hg 初始化主2|$ cd 主3|$ hg init 嵌套4|$回声测试>嵌套/富5|$ hg -R 嵌套添加嵌套/foo6|$ echo 嵌套 = 嵌套 >.hgsub7|$ hg 添加 .hgsub8|$ ci -m "初始提交"

问题

  1. 从版本 0.9.2 开始,可以使用 TortoiseHG 执行任何或所有这些步骤吗?如果是,如何?我很确定第 1-3 行可以,但我不知道第 4-7 行.TortoiseHG 中似乎没有记录这些内容.
  2. 上面的代码做了什么(逐行解释将不胜感激).以下是我在试图破译它时想到的一些具体问题:
    • > 有什么作用?我尝试在 Mercurial 文档中搜索 >,但没有找到任何内容.
    • 在第 5 行,我不明白 nested/foo 是什么.foo 是从哪里来的?什么是foo?一个存储库?文件夹?
    • 第 6 行 - 这让我完全困惑.
    • 在第 7 行,我假设 .hgsub 被添加到 main?或者它是否被添加到 nested 中?
  3. 假设我设置了我的子存储库,并且我的 Bar 存储库现在已达到修订版 10.如果我尝试将我的工作目录更新到修订版 7,这是否会导致我的库文件夹(My Documents/Development/Libraries/ProjectA.../Libraries/ProjectB) 以更新到修订版 7 中存储的任何内容?

更新

我添加了第 8 行代码:ci -m "initial commit".这做了两件事:(1)向主存储库添加一个 .hgsubstate 文件,(2)提交所有更改,包括新的子存储库到主存储库(带有消息初始提交")..hgsubstate 文件的目的是跟踪所有子存储库的状态,因此如果您返回到较早的修订版,它也会从所有子存储库中获取正确的修订版.

<小时>

更新 2 - 一些说明

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

创建子仓库

  1. Libraries/ProjectALibraries/ProjectB 和主要存储库(Projects/Foo/SolutionProjects/Bar/解决方案) 必须是单独的存储库.
  2. 打开Projects/Foo/Solution.
  3. Libraries/ProjectA 克隆到 Projects/Foo/Solution.
  4. ProjectA 添加到 Foo 存储库.
  5. 使用文本编辑器创建一个名为 .hgsub 的文件,其中包含以下内容:

    ProjectA = ProjectA

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

    cd c:...ProjectsFooSolutionhg ci -m "提交子仓库 "ProjectA"

  7. 对于 Bar,步骤基本相同,只是 .hgsub 文件应该包含两个项目的条目,如下所示:

    ProjectA = ProjectA项目 B = 项目 B

注意:从 TortoiseHG 0.10(定于 3 月发布)开始,您将能够使用 HG Commit shell 命令来执行此操作,但现在,你必须使用命令行.

一旦这一切都设置好了,事情就会变得容易一些.

提交更改 - 要提交对 FooBar 的更改,您需要执行 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

  1. 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.
  2. 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 did foo come from? What is foo? A repository? A folder?
    • Line 6 - this one completely baffles me.
    • In line 7, I assume .hgsub is being added to main? Or is it being added to nested?
  3. 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

  1. Libraries/ProjectA, Libraries/ProjectB, and the main repositories (Projects/Foo/Solution and Projects/Bar/Solution) must be separate repositories.
  2. Open Projects/Foo/Solution.
  3. Clone from Libraries/ProjectA to Projects/Foo/Solution.
  4. Add ProjectA to the Foo repository.
  5. Use a text editor to create a file called .hgsub, containing the following:

    ProjectA = ProjectA
    

  6. Open a DOS console window and enter the following commands (see note below):

    cd c:...ProjectsFooSolution
    hg ci -m "Committing subrepo "ProjectA"
    

  7. 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆