Git,如何在不使用子模块的情况下组合保留历史的多个项目

时间:2017-09-03 07:01:55

标签: git version-control merge repository project

我们在Git版本控制下几乎没有明显的maven项目。现在,我想将这些项目组合为聚合POM下的maven多模块项目,并为这个多模块项目创建一个新的存储库。

但是,我不想丢失这些聚合项目的历史记录。我尝试为聚合项目初始化一个新的存储库,并克隆工作树下的现有存储库。但是,这些子存储库被隐含地视为git子模块,而且我不是git子模块API的粉丝。我觉得它对其他开发者来说也太模糊了,在没有实际需要的情况下使事情变得太复杂。

我想以某种方式将这些存储库中的历史记录合并到新的聚合存储库中。在合并历史记录之后,我不希望与原始存储库同步,但只是版本控制在没有子模块的新聚合存储库下的所有内容。不过,我想检查任何合并存储库的特定提交。

Git中有可能吗?

2 个答案:

答案 0 :(得分:1)

  1. 初始化新的回购。

  2. 从所有多个项目中复制所需版本的文件并将它们组合在一起。如有必要,您可以重新排列目录结构。并确保文件具有预期的内容。

  3. 设置.gitignore.gitattribute等。全部添加并为新回购提交第一次提交。

  4. 从多个项目中获取分支,并使用选项-s ours将它们全部合并。 ours策略仅在没有实际内容的情况下合并历史记录。

  5. 示例:

    我们说我们有RepoA,RepoB和RepoC,都有一个分支master。我们将合并这三个分支的最新版本的文件。

    git init RepoABC
    cd RepoABC
    #copy the files all RepoA, RepoB, RepoC and rearrange the directory structure if necessary.
    #add .gitignore, .gitattribute, etc if necessary.
    git add .
    git commit -m 'new root for combining RepoA RepoB and RepoC'
    git fetch origin_repoa master:repoa_master
    git fetch origin_repob master:repob_master
    git fetch origin_repoc master:repoc_master
    git merge repoa_master repob_master repoc_master -s ours -m 'Merge and preserve the histories of RepoA, RepoB and RepoC, with merge strategy "ours"'
    

    现在我们可以专注于新的repo分支并进行新的更改。历史是保留的,我们可以回顾它们。如果目录结构已经重新排列,那么当我们第一次检出旧提交时,我们可能会遇到一个小问题。签出提交后,新文件夹和文件将保留为未跟踪文件。 git clean -df会跳过它们,因此我们必须rm -rf一次。{/ p>

答案 1 :(得分:1)

是的,这可能是git。

假设需要组合两个repos / projects,并且对于每个repo,都有不同的分支:

Repo1:masterdev1

回购2:masterdev2

在新的仓库中,您可以将项目与以下命令组合在一起:

git init
# make changes and commit on master branch if you want to combine the aggregated projects in non-master branch
git remote add repo1 <URL for repo1> -f
git remote add repo2 <URL for repo2> -f
git checkout -b repo1_master repo1/master
git checkout -b repo1_dev1 repo1/dev1
git checkout -b repo2_master repo2/master
git checkout -b repo2_dev2 repo2/dev2

现在,repo1和repo2中的所有分支都聚合在分支中新创建的仓库中:repo1_masterrepo1_dev1repo2_masterrepo2_dev2。如果您不再需要从repo1和repo2进行更改,则可以删除遥控器:

git remote rm repo1
git remote rm repo2