标签: subrepos

在Mercurial中组织具有共享依赖项的项目的好方法是什么?

目前,我正在从遗留版本控制系统转移并将我的团队项目转移到mercurial.作为我正在移动的代码类型的一个例子,我有一个25+项目的Visual Studio解决方案,包含几个独立的应用程序区域,这些区域都依赖于公共代码.查看Stack Overflow,我发现的最接近的问题就是这个问题,但它只提到了版本控制.我正在寻找有关使用Mercurial管理这些依赖项的具体实现技术的进一步建议.

依赖关系的简化视图如下所示.(这仅用于说明和示例;实际依赖性明显更复杂,但性质相似.)

                     Common Lib 1
                    /      |      \
                ----       |       -----   
               /           |        \   \
            App 1    Common Lib 2    \ App 2
                       /   |   \      \
                -------    |    ------ |
               /           |          \|
             App 3       App 4      App 5
Run Code Online (Sandbox Code Playgroud)

Common Lib模块将是共享代码 - 这将是一个DLL或SO或一些其他库,可以在编译和运行时同时在所有应用程序之间使用.否则,应用程序将能够彼此独立地运行.

设置我的mercurial存储库有几个目标:

  • 为每个重要的应用程序或组件组提供自己的存储库
  • 使每个存储库自包含.
  • 使项目的总和自包含.
  • 可以轻松地立即构建整个代码库.(最终,所有这些程序和库最终都在一个安装程序中.)
  • 把事情简单化.

另一点是我有一个服务器设置,我为每个项目都有单独的存储库.

我看到了几种铺设这些项目的方法.

1.创建一个包含所有内容的"Shell"存储库.

这将使用基于url的子版本(例如,在.hgsub中,我会做类似的事情.)做出来,它将如下所示:App1 = https://my.server/repo/app1

+---------------------------+
| Main Repository           |
| | +---------------------+ |
| +-| Build               | |
| | +---------------------+ |
| …
Run Code Online (Sandbox Code Playgroud)

mercurial project-management subrepos

62
推荐指数
1
解决办法
4869
查看次数

Mercurial Subrepos - 你如何创建它们以及它们如何工作?

情况

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

目录结构:

-- 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 …
Run Code Online (Sandbox Code Playgroud)

version-control mercurial tortoisehg subrepos

36
推荐指数
2
解决办法
9013
查看次数

将大型仓库拆分为多个子仓库并保留历史记录(Mercurial)

我们有一大堆代码,包含SVN中一个目录中的几个共享项目,解决方案文件等.我们正在迁移到Mercurial.我想借此机会将我们的代码重新组织到几个存储库中,以便克隆分支的开销更少.我已经成功地将我们的回购从SVN转换为Mercurial,同时保留了历史.我的问题:如何在保留历史记录的同时将所有不同的项目分解为单独的存储库?

以下是我们的单个存储库(OurPlatform)目前的示例:

/OurPlatform
---- Core
---- Core.Tests
---- Database
---- Database.Tests
---- CMS
---- CMS.Tests
---- Product1.Domain
---- Product1.Stresstester
---- Product1.Web
---- Product1.Web.Tests
---- Product2.Domain
---- Product2.Stresstester
---- Product2.Web
---- Product2.Web.Tests
==== Product1.sln
==== Product2.sln
Run Code Online (Sandbox Code Playgroud)

所有这些都是包含VS项目的文件夹,解决方案文件除外.Product1.sln和Product2.sln都引用了所有其他项目.理想情况下,我想采取每个文件夹,并将它们转换为单独的Hg回购,并为每个项目添加新的回购(它们将充当父回购).然后,如果有人打算使用Product1,他们将克隆Product1 repo,其中包含Product1.sln和Subrepo对ReferenceAssemblies,Core,Core.Tests,Database,Database.Tests,CMS和CMS.Tests的引用.

因此,通过项目目录中的hg init'ing很容易做到这一点.但这可以在保存历史的同时完成吗?或者有更好的方法来安排这个吗?

编辑::::

感谢Ry4an的回答,我完成了我的目标.我想分享我在这里为别人做的事情.

由于我们有很多单独的项目,我编写了一个小的bash脚本来自动创建文件映射并创建最终的bat脚本来实际进行转换.从答案中不完全明显的是,convert命令需要为每个文件映射运行一次,以便为每个项目生成一个单独的存储库.此脚本将放在您先前转换的svn工作副本上方的目录中.我使用了工作副本,因为它的文件结构最符合我想要的最终新的hg repos.

#!/bin/bash

# this requires you to be in: /path/to/svn/working/copy/, and issue: ../filemaplister.sh ./

for filename in *
do
  extension=${filename##*.} #$filename|awk -F . '{print $NF}'
  if [ "$extension" == "sln" -o "$extension" == "suo" -o "$extension" == "vsmdi" …
Run Code Online (Sandbox Code Playgroud)

svn mercurial visual-studio subrepos

29
推荐指数
1
解决办法
4140
查看次数

如何防止mercurial推送subrepos?

在我的存储库中,我为我正在使用的模块添加了几个子存储库.我总是将这些subrepos视为"仅拉动".我不打算对它们进行任何更改,但希望保留在新版本发布时轻松提取新更改的功能.

当我推送主存储库时,Mercurial尝试推送子存储库.有什么设置可以防止这种情况吗?

mercurial push subrepos mercurial-subrepos

26
推荐指数
2
解决办法
3427
查看次数

使用Mercurial/TortoiseHg处理嵌套Hg存储库的正确方法是什么?

我正在努力如何使用TortoiseHg正确跟踪嵌套存储库.

我有一个主存储库来跟踪我的整个项目.该项目包含几个存储在plugins /子目录中的小插件.

我希望独立跟踪每个插件(为每个插件提交和推送BitBucket),同时仍然可以对我的项目进行"整体"提交,包括对插件所做的更改并将其推送到其他位置(不是BitBucket).

到目前为止我所做的就是为每个插件创建一个新的repo.我可以轻松地将它们推送到BitBucket.但是当我去提交我的"主"存储库时,TortoiseHg会显示一条错误消息abort: path 'mainrepo\\plugins\\plugin1\\plugin1.php' is inside repo 'mainrepo\\plugins\\plugin1'.

我可以看到我做错了什么,但我不知道是什么.

我在WinXP上使用了每晚的Mercurial和TortoiseHg(ToirtoiseHg版本0.9.3 + 237-ea50f793bbe4和Mercurial-1.4.3 + 225-70dea42c9406).我读到subrepos处理被添加到这个TortoiseHg构建中,但是,我甚至不确定subrepos是我应该在这里使用的功能.

更新
我已经取得了一些进展,但仍然无法按照我喜欢的方式工作.
这是我的结构:

-- .hg
-- core
-- app
    -- file.php
    -- file.css
    -- plugins
        -- plugin1
            -- file1.php
        -- plugin2
            -- file2.php
Run Code Online (Sandbox Code Playgroud)

我去了app/plugins,并在这里克隆了一个来自BitBucket的插件(名为plugin3).然后我在根目录创建了一个.hgsub文件并添加app/plugins/plugin3 = app/plugins/plugin3到它.然后我能够提交我的整个目录.

但后来我尝试从BitBucket获取最新版本的plugin1,所以我去了app/plugins,删除了plugin1 /文件夹并从BitBucket克隆了plugin1.然后我加入app/plugins/plugin1 = app/plugins/plugin1了.hgsub但是当我试图提交时,我受到了欢迎abort: path 'app/plugins/plugin1/file1.php' is inside repo 'app\\plugins\\plugin1'

当我的subrepo与插件/目录中已由Hg跟踪的目录具有相同的名称时,问题似乎就开始了.

我究竟做错了什么 ?我应该在插件的.hg中添加/编辑特殊内容吗?

更新
我终于设法让它以我想要的方式工作.
我必须"手动"告诉Mercurial删除plugins/plugin1,plugins/plugin2目录,提交更改,然后从BitBucket克隆plugin1和plugin2,添加app/plugins/plugin1 = app/plugins/plugin1到.hgsub并提交全部.有效.
删除plugin1/plugin2文件夹后,重要的一步是提交.

mercurial tortoisehg subrepos

22
推荐指数
2
解决办法
1万
查看次数

Hg子存储库依赖项

过去(这里这里)有关于Hg子回购依赖关系的几个问题但是接受的答案似乎并没有解决我的问题.

我的一个项目有4个依赖项:A,B,C,D.D依赖于A,B和C; 而B和C依赖于A:

A,B,C,D的依赖图

我想使用Hg子存储库来存储它们,以便我可以跟踪它们所依赖的每个版本.这是因为,当我用A,B,C和d在这个项目,其他项目将需要的只是A和B.因此,B和C必须独立于D来跟踪它们所需的A版本.同时,在我的应用程序中,给定版本的D引用的B和C版本必须始终使用与A引用的版本相同的A版本.给定版本的D(否则它将在运行时崩溃).我真正想要的是允许他们在同一目录中作为兄弟姐妹互相引用 - 即D's .hgsub看起来像下面这样,而B和C看起来就像是第一行.

..\A = https:(central kiln repo)\A
..\B = https:(central kiln repo)\B
..\C = https:(central kiln repo)\C
Run Code Online (Sandbox Code Playgroud)

然而,这似乎不起作用:我可以看到为什么(给人们足够的绳索让自己挂起来很容易),但我觉得它是我的依赖关系的最佳解决方案,这是一种耻辱.我已经阅读了一些建议的解决方案,我会快速概述这些解决方案以及它们为什么不能为我工作:

  1. 将副本包含为嵌套子目录,将这些副本引用为Hg子存储库.这会产生以下目录结构(我删除了A,B,C,B\A,C\A的主副本,因为我可以接受引用\ D中的副本):

    • project \(所有主要项目文件)
    • 项目\ d
    • 项目\ d\A
    • 项目\ d \乙
    • 项目\ d\B \一
    • 项目\ d\C
    • 项目\ d\C\A

    这种方法的问题:

    • 我现在在磁盘上有3个A副本,所有这些副本都可以进行独立修改,在推送到中央仓库之前必须同步并合并.
    • 我必须使用其他机制来确保B,C和D引用相同版本的A(例如D可以使用v1而D\B可以使用v2)
  2. 变体:使用上面但指定.hgsub的RHS指向父副本中的副本(即B和C应该具有下面的.hgsub):

    A = ..\A
    
    Run Code Online (Sandbox Code Playgroud)

    这种方法的问题:

    • 我仍然在磁盘上有三个副本
    • 第一次克隆B或C时,它将尝试递归地从"..\A"中提取A的引用版本,这可能不存在,可能会导致错误.如果它不存在,则不知道应该找到回购的位置.
    • 当我进行递归推送更改时,D\B\A中的更改不会进入共享的中央存储库; 他们只是被推到D\A而不是.因此,如果我连续两次推送,我可以保证所有更改都会正确传播,但这是一个相当的软糖.
    • 类似地,如果我做(手动)递归拉动,我必须得到正确的顺序以获得最新的更改(即在我拉D\B\A之前拉D\A)
  3. 使用符号链接将文件夹\ D\B\A指向D\A等.

    这种方法的问题:

    • 符号链接无法在Hg repo本身中进行编码,因此每次团队成员克隆回购时,他们都必须手动/使用脚本重新创建符号链接.这可能是可以接受的,但我更喜欢更好的解决方案.另外(个人喜好)我发现符号链接非常不直观.

这些是最好的解决方案吗?我的初始.hgsub(见上)是一个梦想有没有一个很好的理由,还是有办法我可以请求/实现这个改变?

更新以更好地解释A,B,C,D的更广泛使用

mercurial dependencies subrepos

19
推荐指数
2
解决办法
3798
查看次数

mercurial子存储库是否必须是主存储库的子目录?

我的项目由以下位置的代码组成

C:\Dev\ProjectA
C:\Lib\LibraryB
C:\Lib\LibraryC
Run Code Online (Sandbox Code Playgroud)

目前,这些文件夹中的每一个都是完全独立的Mercurial存储库.项目A一直在变化,图书馆B和图书馆C很少变化.

我现在标记了项目A的每个版本,因为它已经发布,并且(当我记得的时候)在库B和C库中放置了相应的标签.

我可以通过使用子库来改进吗?这需要我将库B和C作为项目A的子目录吗?

如果库B和C必须是项目A的子目录,如果我想启动使用库B的项目D但是根本不属于项目A,我该怎么办?

mercurial subrepos

18
推荐指数
1
解决办法
3460
查看次数

推动mercurial repo而不推动subrepos

我正在使用Mercurial 1.6.我有一个带有一些subrepos(11)的回购.我想将父回购推送到默认的远程仓库而不推送子回购.想要这样做的原因包括:

  • 我正在使用SSH repos,并且需要很长时间来建立连接并且不向每个子目录推送任何内容.
  • 我在subrepos中提交我不想传播到远程存储库(尚未).
  • 子目录已经命名了不应该传播到repote repos的分支(并且显然没有办法将分支名称传递给subrepos的push操作).

但是,我一直无法找到实现这一目标的方法.我尝试删除.hgsub和.hgsubstate的内容(没有提交),但仍然坚持推动subrepos.

如何将更改从本地存储库推送到远程存储库并暂时忽略子存取?

mercurial subrepos

11
推荐指数
1
解决办法
2334
查看次数

将多个子版本加入一个并保留Mercurial中的历史记录

目前我的项目包含多个存储库,例如:

+---Project (main repo)
    +---Core (subrepo)
    +---Web (subrepo)
    \---Tests (subrepo)

不幸的是,subrepos之间的代码是完全耦合的,因此它不能很好地与分支一起工作.

有没有办法将subrepos整合到一个保存历史记录的主存储库中?

mercurial subrepos

11
推荐指数
1
解决办法
2173
查看次数

Mercurial:Subrepo错误 - "中止:提交新的subrepo [路径]排除"

我正在尝试在我的Mercurial项目仓库中为项目的依赖项设置子库.但是当我尝试提交.hgsub文件时,我不断收到此错误:

abort: commit with new subrepo lib/dependency-dir excluded
Run Code Online (Sandbox Code Playgroud)

细节:

在我的项目的Mercurial存储库目录(在顶层)中,我有一个子目录,lib/它将包含我的依赖项.

碰巧我的所有依赖都存在于github上,我在这里分叉了每个库来创建,例如,https://github.com/mygithubaccount/forked-dependency

我创建了一个.hgsub文件并将其添加到存储库(也在顶层).它包含如下条目(我已经尝试将每个单独隔离如下;它似乎没有任何区别):

lib/dependency-dir = [git]https://github.com/mygithubaccount/forked-dependency.git
Run Code Online (Sandbox Code Playgroud)

然后我从项目存储库的工作目录开始执行以下操作:

$ cd lib
$ git clone https://github.com/mygithubaccount/forked-dependency.git dependency-dir
$ cd ..
$ hg commit .hgsub
abort: commit with new subrepo lib/dependency-dir excluded
Run Code Online (Sandbox Code Playgroud)

我有什么想法我做错了吗?

mercurial subrepos

11
推荐指数
2
解决办法
3226
查看次数