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

时间:2011-05-25 00:18:31

标签: 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)

我想要的是:

New Base Project D (repo D)
   /Project A
   /Project B
   /Project C

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

将解决方案转换为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"

Git太棒了..

3 个答案:

答案 0 :(得分:11)

您可以执行一项称为“子树合并”的操作,将多个存储库合并为一个存储库。我们假设想要将~/projects/alpha~/projects/beta合并到一个新项目~/projects/multi中:

$ cd ~/projects/multi
$ git init

合并“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"

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

所有历史记录仍然存在,项目将位于子目录中。我在我的家用计算机上使用这个“死项目存储库” - 一个包含我曾经工作的所有内容的大型git存储库,要么被放弃,要么不足以用于自己的存储库。

答案 1 :(得分:2)

我没有足够的声誉评论你的历史问题,所以我必须写一个答案。

使用--follow with log

--follow
       Continue listing the history of a file beyond renames (works only
       for a single file).

答案 2 :(得分:0)

我要做的是选择子模块。但如果您真的想要合并回购,请执行以下操作:

  • 创建新存储库
  • 进行初步提交
  • 从那里为您想要合并的每个项目制作分支
  • 对于您要合并的每个项目:
    • 切换到其临时分支
    • 合并原始存储库
    • 将其移至项目目录(使用git mv)
    • 提交
  • 合并(掌握)并删除每个临时项目分支