git - 如何将 Git 项目迁移为包含子项目的一个项目

标签 git version-control git-submodules

我现在有许多项目位于不同的 Git 存储库中。同样,它们在单独的 eclipse 项目中(因为由于 m2 插件中的错误,我很长时间无法使用使用 Maven 插件的父项目)。现在可以了。

所以我在 Maven 中组合了这些项目,制作了一个基础 pom 项目,并将其作为父项目添加到其他项目中。然后我嵌套了子项目。

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

看起来完成此操作的唯一方法是丢失正在 merge 的项目中的所有历史记录。

为了 super 清楚,当前有:

Project A (repo A)
Project B (repo B)
Project C (repo C)

我想要的是:

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

我宁愿不丢失任何历史记录,但如果必须这样做,我想我可以保留以前的版本。我不认为我想要子模块,因为它们似乎适合包括不受您控制的远程 repo 。

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

最佳答案

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

$ cd ~/projects/multi
$ git init

merge 到“alpha”项目中...

$ git remote add -f alpha ~/projects/alpha
$ git merge -s ours --no-commit --allow-unrelated-histories alpha/master
$ git read-tree --prefix=alpha -u alpha/master
$ git commit -m "Added project alpha"

以同样的方式 merge 到“测试版”项目中。如果更改是永久性的,那么您可以删除新项目中的 alpha Remote 。如果 alpha 存储库中仍有开发,那么您不仅可以保留历史,还可以引入新的更改。

所有历史记录仍将存在,项目将位于子目录中。我在家用计算机上将其用于“死项目存储库”——一个巨大的 git 存储库,其中包含我曾经从事过的所有工作,这些存储库要么被废弃,要么不够大,无法容纳自己的存储库。

关于git - 如何将 Git 项目迁移为包含子项目的一个项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6118261/

相关文章:

java - Intellij 在项目之间共享模块

git 子模块替换不会分离头

git - 如何在 one-repo 中将 Git 与 "multiple (thousands) projects"一起使用?

git - 使用 pip 安装特定的 git commit

git - 将大型 SVN 存储库迁移到 git

git - 如何为子模块更新编写 git 提交消息?

Git::将多模块项目拆分为 2 个模块并保留历史记录

Mac OS 上的 git 命令行错误 "dyld: Symbol not found: ___strlcpy_chk"

git - 如何从 git 历史记录中删除提交但保持图形完全相同,包括 merge ?

version-control - 违背组织中使用的通用源代码控制