目前,我正在从遗留版本控制系统转移并将我的团队项目转移到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存储库有几个目标:
另一点是我有一个服务器设置,我为每个项目都有单独的存储库.
我看到了几种铺设这些项目的方法.
这将使用基于url的子版本(例如,在.hgsub中,我会做类似的事情.)做出来,它将如下所示:App1 = https://my.server/repo/app1
+---------------------------+
| Main Repository |
| | +---------------------+ |
| +-| Build | |
| | +---------------------+ |
| …
Run Code Online (Sandbox Code Playgroud) 情况
我有两个.NET解决方案(Foo
和Bar
)以及一个包含ProjectA,ProjectB和ProjectC的公共库.Foo
并Bar
引用一个或多个库项目,但库项目不在Foo
和Bar
解决方案文件夹中.
目录结构:
-- 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) 我们有一大堆代码,包含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) 在我的存储库中,我为我正在使用的模块添加了几个子存储库.我总是将这些subrepos视为"仅拉动".我不打算对它们进行任何更改,但希望保留在新版本发布时轻松提取新更改的功能.
当我推送主存储库时,Mercurial尝试推送子存储库.有什么设置可以防止这种情况吗?
我正在努力如何使用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文件夹后,重要的一步是提交.
过去(这里和这里)有关于Hg子回购依赖关系的几个问题但是接受的答案似乎并没有解决我的问题.
我的一个项目有4个依赖项:A,B,C,D.D依赖于A,B和C; 而B和C依赖于A:
我想使用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)
然而,这似乎不起作用:我可以看到为什么(给人们足够的绳索让自己挂起来很容易),但我觉得它是我的依赖关系的最佳解决方案,这是一种耻辱.我已经阅读了一些建议的解决方案,我会快速概述这些解决方案以及它们为什么不能为我工作:
将副本包含为嵌套子目录,将这些副本引用为Hg子存储库.这会产生以下目录结构(我删除了A,B,C,B\A,C\A的主副本,因为我可以接受引用\ D中的副本):
这种方法的问题:
变体:使用上面但指定.hgsub的RHS指向父副本中的副本(即B和C应该具有下面的.hgsub):
A = ..\A
Run Code Online (Sandbox Code Playgroud)
这种方法的问题:
使用符号链接将文件夹\ D\B\A指向D\A等.
这种方法的问题:
这些是最好的解决方案吗?我的初始.hgsub(见上)是一个梦想有没有一个很好的理由,还是有办法我可以请求/实现这个改变?
更新以更好地解释A,B,C,D的更广泛使用
我的项目由以下位置的代码组成
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 1.6.我有一个带有一些subrepos(11)的回购.我想将父回购推送到默认的远程仓库而不推送子回购.想要这样做的原因包括:
但是,我一直无法找到实现这一目标的方法.我尝试删除.hgsub和.hgsubstate的内容(没有提交),但仍然坚持推动subrepos.
如何将更改从本地存储库推送到远程存储库并暂时忽略子存取?
目前我的项目包含多个存储库,例如:
+---Project (main repo) +---Core (subrepo) +---Web (subrepo) \---Tests (subrepo)
不幸的是,subrepos之间的代码是完全耦合的,因此它不能很好地与分支一起工作.
有没有办法将subrepos整合到一个保存历史记录的主存储库中?
我正在尝试在我的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)
我有什么想法我做错了吗?