如何将Git项目迁移到包含子项目的一个项目

Rob*_*Rob 16 git version-control git-submodules

我现在有许多项目在单独的Git存储库中.它们同样也是在单独的eclipse项目中(因为m2插件中的错误导致我无法长时间使用Maven插件使用父项目).现在有效.

因此,我将Maven中的项目组合在一起,制作了一个基础pom项目,并将其作为其他项目的父项添加.然后我嵌套了子项目.

当我将基础项目作为git项目提交时,它已经确定子目录是子模块,即使根目录中没有.gitmodules文件.

看起来完成此任务的唯一方法是丢失正在组合的项目中的所有历史记录.

只是要非常明确,目前有:

Project A (repo A)
Project B (repo B)
Project C (repo C)
Run Code Online (Sandbox Code Playgroud)

我想要的是:

New Base Project D (repo D)
   /Project A
   /Project B
   /Project C
Run Code Online (Sandbox Code Playgroud)

我宁愿不丢失任何历史,但如果必须,我想我可以在以前的版本中使用.我不认为我想要子模块,因为这些子模块似乎适合包含不受您控制的远程回购.

将解决方案转换为bash脚本.它假定您要添加的子目录位于与父级相同级别的子目录中.这里是:

#! /bin/bash
git remote add -f $1 ../$1
git merge -s ours --no-commit $1/master
git read-tree --prefix=$1 -u $1/master
git commit -m "Added project $1"
Run Code Online (Sandbox Code Playgroud)

Git太棒了..

Die*_*Epp 11

您可以执行一个称为"子树合并"的操作,将多个存储库合并为一个存储库.让我们假设要合并~/projects/alpha,并~/projects/beta进入一个新的项目,~/projects/multi:

$ cd ~/projects/multi
$ git init
Run Code Online (Sandbox Code Playgroud)

合并"alpha"项目......

$ git remote add -f alpha ~/projects/alpha
$ git merge -s ours --no-commit alpha/master
$ git read-tree --prefix=alpha -u alpha/master
$ git commit -m "Added project alpha"
Run Code Online (Sandbox Code Playgroud)

以同样的方式合并"beta"项目.如果更改是永久性的,则可以删除新项目中的alpha遥控器.如果alpha repo中仍有开发,那么你不仅可以保留历史记录,还可以进行新的更改.

所有历史记录仍将存在,项目将位于子目录中.我使用这个我家里的电脑上的"死项目库" - 我对工作过大规模的含git仓库一切都被遗弃或不适合自己的回购足够大.