Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Maven Hg:将多个存储库连接到一个存储库中_Maven_Mercurial - Fatal编程技术网

Maven Hg:将多个存储库连接到一个存储库中

Maven Hg:将多个存储库连接到一个存储库中,maven,mercurial,Maven,Mercurial,我使用mercurial来管理我的资源。 今天,我有12个不同的存储库,每个存储库大约有6个分支。 每个存储库都包含一个maven项目。 我希望创建一个父项目,将所有项目声明为一个模块,并将所有项目合并到一个存储库中。 为了直观起见,今天我有: -报告1/项目1 -报告2/项目2 ... -报告12/project12 我想: -全球报告 -模块1 -模块2 - ... -模块12 保留分支和历史(如果可能) 这样做的最佳实践是什么?(次级回购、合并…) 谢谢 可以将不相关的存储库拉到一起并合并

我使用mercurial来管理我的资源。 今天,我有12个不同的存储库,每个存储库大约有6个分支。 每个存储库都包含一个maven项目。 我希望创建一个父项目,将所有项目声明为一个模块,并将所有项目合并到一个存储库中。 为了直观起见,今天我有: -报告1/项目1 -报告2/项目2 ... -报告12/project12

我想: -全球报告 -模块1 -模块2 - ... -模块12

保留分支和历史(如果可能)

这样做的最佳实践是什么?(次级回购、合并…)


谢谢

可以将不相关的存储库拉到一起并合并它们。诀窍是在合并之前将文件重命名到特定目录中

例如,下面的脚本创建了三个独立的存储库,每个项目的根目录中有三个文件。然后,它将它们合并到一个存储库中,每个项目中的文件将被移动到子目录中:

@REM Create three separate repositories
hg init Repo1
hg init Repo2
hg init Repo3
@REM Add and commit files to each of them.
cd Repo1
echo >file1
echo >file2
echo >file3
hg ci -Am r1
cd ..\Repo2
echo >file4
echo >file5
echo >file6
hg ci -Am r2
cd ..\Repo3
echo >file7
echo >file8
echo >file9
hg ci -Am r3
cd ..
@REM Create a global repo.
hg init globalRepo
cd globalRepo
@REM Pull in the first repo and move the files in it to a module1 subdirectory.
@REM Force the pull since it is an unrelated repo and update to it.
hg pull ..\Repo1 -f
hg update tip
md module1
hg rename * module1
hg ci -m "Rename Repo1 files to module1 directory."
@REM Pull in the second repo and move the files in it to a module2 subdirectory.
hg pull ..\Repo2 -f
hg update tip
md module2
hg rename * module2
hg ci -m "Rename Repo2 files to module2 directory."
@REM Merge the two unrelated branches together.
hg merge
hg ci -m "Merge the two unrelated repositories together."
@REM Pull in the third repo, rename, and merge.
hg pull ..\Repo3 -f
hg update tip
md module3
hg ren * module3
hg ci -m "Rename Repo3 files to module3 directory."
hg merge
hg ci -m Merge
结果如下所示。请注意,原始三个项目的整个历史记录都将以没有父节点的根节点开始。文件在每个项目中移动到其最终目录目标,然后合并在一起


以下是我的解决方案列表,按复杂性排序,从最简单的开始

忘记历史

最简单的。将每个项目的默认分支的当前状态放在新项目结构的中。然后开始新的回购协议

我们还没有被告知分支的活动程度,但如果它们是活动的,您可以对每个分支执行相同的操作:

hg up null       # not strictly necessary, but may avoid the impression that a branch started now.
hg branch <name>
<populate directory structure with the current state of a branch from each project>
hg commit
hg up null#严格来说不是必需的,但可以避免分支现在就开始的印象。
汞分支
hg提交
您仍然可以访问原始项目回购中的历史记录。您无法轻松地将新变更集与旧历史进行比较。显然,这种需求会随着时间的推移而减少,但这对你来说可能很重要

合并

通过合并回购保留历史是可能的。首先,每个项目回购必须将其所有文件移动到子目录,以反映全球回购的预期结构:

for <each project>
    md projdir
    hg rename * projdir
    hg commit
用于
md projdir
hg-rename*projdir
hg提交
然后每个项目都可以纳入全球项目:

cd globalrepo
hg init
hg pull <first subproject>
for <other subprojects>
    hg pull -f <subproject>     # the -f is necessary because the projects are unrelated.
    hg merge
    hg commit
cd globalrepo
汞离子
汞拉力
对于
hg pull-f#-f是必要的,因为这些项目是不相关的。
汞合并
hg提交
这应该给你一个完整历史的合并

在将文件与“旧”历史记录进行比较时,请记住(或使用别名)对具有--git选项(至少是diff和export)的命令使用--git选项。请记住,虽然历史记录可能是完整的,但可能会令人困惑,因为每个项目的历史记录都是连续的

使用次级回购

按照您的建议,可以使用子回购加入回购。话虽如此,次级回购旨在不太活跃独立成分。在您的用例中,这两种情况似乎都不正确

在您的情况下,这些项目不会是独立的,因为它们只在新的全球回购协议中使用,而不会与其他全球回购协议共享

如果子回购协议处于活动状态,就像在您的用例中一样,您必须保持警惕,记住同时提交子回购协议和父回购协议。如果不记住这一点,可能会引起不适,因为多个头部会导致推压中止。如果人员A将变更集推送到子回购,而不推送到父回购,则会发生这种情况;然后,人员B更新到父repo的提示(它不会拉取新的子repo变更集),并尝试将其提交推送到同一个子repo上。如果您团队中的每个人都能胜任Hg,那么这对您来说可能很好,但如果不行,我建议不要在您的用例中使用subrepos

如果存在活动分支,子回购将保留它们,但全球回购将不会看到它们,除非它也分支:

cd globalrepo
hg up null       # not strictly necessary, but may avoid the impression that a branch started now.
hg branch <branch>
for <each subrepo>
    cd <project dir>
    hg up <branch>
cd globalrepo
hg commit
cd globalrepo
hg-up-null#严格来说不是必需的,但可以避免分支现在就开始的印象。
汞分支
对于
光盘
汞柱
全球报告光盘
hg提交

我希望您能理解(未经测试,此位来自内存)。

为什么不使用带有Convert扩展名的oneliner而不是大量md | ren?@MarkTolonen我对合并的看法是一样的。“如果我先看到这一点,我会错过的。”懒虫,为什么不显示一个带有转换扩展名的答案呢?我个人认为,在这种情况下,拉/重命名/合并比使用转换更容易。您好,不幸的是,我在尝试合并时遇到了问题,因为我的全局回购中有许多头。只需选择一个头合并即可。更新到将获得重命名项目的标头
hg merge
与另一个分支合并。使用最简单的方法,在分支之间合并时没有遇到困难的风险?@maxencramet合并分支需要历史记录,因此不能使用“忘记历史记录”方法。[您没有说您的工作流需要在现有分支之间进行后续合并;我假设它们将永远独立,就像产品发布一样。]