问题标签 [subrepos]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
5223 浏览

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

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

依赖项的简化视图如下所示。(这仅用于说明和示例;实际的依赖关系要复杂得多,但本质上相似。)

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

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

  • 为每个重要的应用程序或组件组提供自己的存储库。
  • 使每个存储库自包含。
  • 使项目的总和自包含。
  • 使一次构建整个代码库变得容易。(最终,所有这些程序和库最终都在一个安装程序中。)
  • 把事情简单化。

另一点是我设置了一个服务器,其中每个项目都有单独的存储库。

我看到了几种布置这些项目的方法。

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

这将使用基于 url 的子存储库(例如,在 .hgsub 中,我会做类似的事情。)布局后,它将如下所示:App1 = https://my.server/repo/app1

shell 存储库中的每个主文件夹都将包含一个子存储库,每个项目区域都有一个子存储库。依赖关系是相对的:例如,由于 App 4 需要 Common Lib 2,它会简单地使用相对路径来引用该公共库。

这种方法的优点:

  • 每个库被拉下一次且仅一次。
  • Mercurial 的 subreos 将确保在所有项目中自动使用相同版本的库,因为项目中仅存在该 subrepo 的一个版本。
  • 很容易找到每个资源。

这种方法的缺点:

  • 我无法独立开发应用程序。例如,如果我在应用程序 2 上工作,并且它需要更改公共库,那么所有其他应用程序都必须立即进行这些更改。
  • 如果我自己提取一个 App 存储库,如果我想构建它,我必须手动弄清楚(或知道)它需要哪些其他依赖存储库。
  • 依赖关系没有被严格分离——在任何地方插入一个新特性是很诱人的,因为它很容易获得所有特性。

2. 完全包含依赖的子存储库。

在这种方法中,每个应用程序都有自己的存储库(如前所述),但这次也包含子存储库:一个用于自己的源,一个用于每个依赖的子存储库。然后,一个整体存储库将包含这些项目存储库中的每一个,并且知道如何构建整个解决方案。这将如下所示:

优点:

  • 每个应用程序都可以自己构建,彼此独立。
  • 可以按应用而不是全局跟踪库的依赖版本。它需要将子存储库插入项目以添加新依赖项的显式行为。

缺点:

  • 在进行最终构建时,每个应用程序可能使用不同版本的共享库。(可能需要编写工具来同步公共库子存储库。Eww。)
  • 如果我想构建整个源代码,我最终会多次拉下共享库。在 Common Lib 1 的情况下,我必须拉它八(!)次。

3. 根本不要将依赖项包含为子存储库——将它们作为构建的一部分引入。

这种方法看起来很像方法 1,除了公共库只会作为构建的一部分被提取。每个应用程序都会知道它需要什么存储库,并将它们放在公共位置。

优点:

  • 每个应用程序都可以自己构建。
  • 公共库只需要拉一次。

缺点:

  • 我们必须跟踪每个应用程序当前使用的库版本。这重复了 subrepo 功能。
  • 我们必须建立一个基础设施来支持这一点,这意味着更多的东西进入构建脚本。啊。

4. 还有什么?

有没有其他的处理方式?更好的方法?您尝试过哪些方法并成功了,您尝试过哪些方法但讨厌?我目前倾向于 1,但缺乏应用程序独立性,当它应该能够时,真的很困扰我。有没有办法在没有大量重复代码拉取和依赖维护噩梦的情况下很好地分离方法 2,而不必编写脚本来处理它(如选项 3)?

0 投票
1 回答
712 浏览

mercurial - Mercurial,更新子仓库位置

我的 subrepo 网址之一已更改,我必须更新所有项目以使用新位置。我碰巧拥有使用该子存储库的所有项目的工作克隆。

但是如果我没有其中一个的工作副本怎么办,我怎么能克隆那个项目并更新它的 subrepo url?是否可以在没有工作副本的情况下更改为 .hgsub?

好像没有办法了。。。

0 投票
2 回答
3659 浏览

mercurial - 如何防止 mercurial 推送子存储库?

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

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

0 投票
1 回答
257 浏览

version-control - mercurial 和 VCS 的新手:共享代码多服务器设置

在我们的小办公室里,我们正在设置 mercurial——我们第一次使用“真正的”版本控制系统。我们有三台服务器——一台实时服务器、一台登台服务器和一台开发服务器。

我们还拥有三个相对较大的网站——一个供访问者使用,一个供用户使用,一个内部网站点供办公室工作人员使用。

这三个网站共享一些代码。(例如——一个php类库,一些常用的代码片段等)

在版本控制之前,我们只是使用符号链接来链接到共享库。例如:每个站点都有一个指向“ObjectClasses”目录的符号链接——对 ObjectClasses 中的文件所做的任何更改都将立即可供所有站点使用。您只需将更改后的文件上传到 staging 和 live,就完成了。

但是... Mercurial 不遵循符号链接。因此,我在三台服务器上的三个站点中为共享库设置了一个子存储库(实际上是“四台”服务器,如果您计算开发服务器上有两个程序员和两个独立的存储库克隆的事实)。

所以共享对象库有 12 个工作副本。

那么问题来了:

有没有办法简化上述设置?

这是我们的工作流程的一个示例,它看起来太复杂了 - 但也许这就是使用版本控制的感觉,我们只需要习惯它:

程序员 A 在站点 1 的子存储库中对对象 Foo 进行了更改。他想让它在任何地方都可用,所以他提交它,然后将它推送到登台服务器。我在登台服务器上设置了挂钩,以自动将更改传播到三个站点、登台服务器上,然后再次传播到实时服务器上的三个站点。这会处理登台和实时服务器上的 6 个工作副本。到目前为止,一切都很好。

但是开发服务器呢,这些文件可能正在进行中?

程序员 A 现在需​​要手动将共享子存储库拉到开发服务器上的站点 2 和 3。他还需要告诉程序员 B 在开发服务器上的站点副本上手动拉取站点 1、2 和 3 上的共享子存储库。如果他在站点 1 上编辑对象 Foo 并在站点 2 上对对象 Foo 进行不同的编辑会怎样。他将不得不解决两个单独的冲突。

我们相对频繁地对对象进行更改。这会让我们发疯。我真的很喜欢版本控制的想法——但是经过两周的努力寻找最佳设置,拥有一份共享文件副本并喊出“嘿-你正在处理那个文件,我想做改变”现在看起来很不错。

真的没有更简单的方法来设置它吗?

0 投票
1 回答
812 浏览

mercurial - 使用 Mercurial 递归标记所有子存储库

是否可以标记主父存储库并将标记也添加到所有子存储库?

如果没有这个,如果我将一个项目作为子存储库删除并单独访问它,它将丢失所有标签信息,因为它只属于父存储库。

0 投票
1 回答
925 浏览

svn - 如何显示子存储库更新的进度?

我有一个包含 SVN 子存储库的 Mercurial 存储库。hg updateMercurial 在处理.hgsubstate文件期间冻结。我知道这是因为 Mercurialsvn在后台执行命令,该命令会拉取正确的 SVN 版本。

这对我的用户来说非常不直观,因为 SVN 子存储库很大,而且整个看起来都挂了。

有没有办法在这种操作期间转储 svn 输出?

0 投票
1 回答
389 浏览

mercurial - 在 mercurial 中使用子存储库来“共享代码”

我有一个存储库,其中有三个子文件夹。
A、B 和一个核心文件夹。

我需要 A 和 B 中的核心文件夹的文件。因此,核心文件夹的每个文件都应该在 A 和 B 中的另一个文件夹中,并且对文件的每次更新都应该提交给“核心”,反之亦然。
所以我尝试将核心文件夹制作为子存储库并将其添加到 A 和 B。

因此,例如在文件夹 B 中,.hgsub 中有以下行在www = ../core
主存储库中位于 .hgsubcore = core

我认为我做错了什么,但也许你有一个提示如何实现我想要的:)

(更新)
澄清:
存储库包含应用程序的不同“项目”。
A是安卓,B是iOS。“核心”包含 HTML+JS 文件,这些文件后来在 Android 和 iOS 项目中用于构建带有 phonegap 的应用程序。

0 投票
1 回答
1085 浏览

mercurial - Mercurial:我可以忽略推/拉文件但仍然提交吗?(.hgsub)

我有一个回购,其中设置了两个子回购,如下所示:

在机器 A 上,我检查了项目、www 和 dev,并修改了 .hgsub。我必须提交这个,以便 hg 识别 www 和 dev 子存储库(提交 -S 等)。

但是机器 B 只使用了项目的 www 功能,所以它看起来像这样:

同样,机器 B 中的 .hgsub 只有一个 www 的条目,我必须提交这个才能让 hg 将其识别为子存储库。

我想做的是推拉到我的中央仓库,但不推/拉.hgsub。否则,如果我从机器 A 提交并推送 .hgsub,然后从机器 B 中提取,我会自动获得我不想要的 dev 子存储库和 www 子存储库。

所以我在机器 B 上再次修改 .hgsub 以仅具有 www 并提交它以使其生效。我在机器 B 上的 www 子存储库中做了一些工作,并希望将其推送回中央存储库,但它也会将更改推送到 .hgsub。现在,当我打开机器 A 时,我的“开发”子存储库消失了,我必须再次将其添加回 .hgsub,然后我像这样来回走动,直到我沮丧地拔掉头发。

有没有办法解决这个问题?.hgsub 必须在每台机器上本地提交才能使子存储库工作,但我不希望它们被推或拉。是否有用于推/拉的 .hgignore?

干杯。

0 投票
1 回答
611 浏览

version-control - 在克隆中进行更改时保持 Mercurial 子存​​储库最新的工作流程?

我已经阅读了有关 Mercurial 子存​​储库的所有问题,但我仍然不确定它是如何工作的。我们在 IIS 上使用 hgweb.cgi,所以我们所有的存储库都有 http:// 路径。

这是基本布局:

在 .hgsub 文件中,我将路径设置为:

如果我想处理这些项目,我会将它们从服务器克隆到我的工作站,这样我就有了 Project1 和 Project2 的克隆,它也会自动提取子存储库。

在本地工作站的 project1 中,我对 /Project1/LibrariesSubrepo 中的文件进行了一些更改。如何确保这些更改返回到服务器上库的源代码库?我是否必须手动将更改从子存储库推送到子存储库的源存储库?

我希望能够在本地对 Project1 存储库进行更改,然后提交/推送这些更改,然后在 Project2 中,我应该能够从应该将 Project2/LibrariesSubrepo 更新到最新版本的服务器中提取更改。

0 投票
3 回答
1736 浏览

mercurial - Mercurial Subrepositories - 您是否必须在子存储库中提交,然后在主存储库中提交?

使用 TortoiseHg 2.1.3 和 Hg 1.9.2。无论我做什么,父 repo 都看不到在 subrepo 中创建的新文件,除非我首先在 subrepo 中提交它们。我认为所有提交和推送都应该只在父仓库上完成?