合并没有共同提交的Git项目

3

现在我有几个使用Git跟踪的项目。现在,我想创建一个大型项目,其中包含以前每个项目的多个子文件夹,并保留它们的历史记录,同时还要保留大型项目的历史记录。

所以基本上我现在拥有的是

projecta/
projectb/
projectc/
bigproject/

And what i want is

bigproject/
    projecta/
    projectb/
    projectc/

不丢失历史记录还有可能实现吗?

干杯


这并不是 Git 的预期使用情况。Git 最适合具有合理内容边界的情况,即每个仓库一个项目。 - user229044
合并仓库后,它将成为一个大项目,尽管“导入”的版本也应该可见。 - noobsaibot
Git子树合并 - John Bartholomew
你的 bigproject/ 路径里面已经有什么东西了吗?还是只是一个用来接收 projectAprojectBprojectC 文件夹的占位符? - JB.
2个回答

3

您可以尝试以下方法:

#Preparing the repos: moving files in subdirectories
cd projecta
mkdir projecta
git mv file1 file2 dir1 dir2 projecta 
git commit -am "Moved file"
#Do it for each other repos

#Actually merging
git clone url_to_projecta bigproject
cd bigproject
git remote add b url_to_projectb
git remote add c url_to_projectc
git fetch --all
git merge b/master
git merge c/master

简单来说,即使Git树没有任何共同点,您也可以合并它们,所以您只需要:

  • 进入其中一个仓库
  • 获取其他仓库(现在您有几个没有共同提交的树)
  • 创建合并提交,合并这些树

就是这样。

如果您想要一个类似于以下文件系统:

bigproject/
  projecta/
  projectb/
  projectc/

最简单的方法是首先解决它。

如果我没记错的话,git merge 不会让你轻易地合并没有共同历史的分支。(至少在我需要它的时候它没有这样做,最后我用 git filter-branch 做了一些非常丑陋的事情来解决它) - JB.
我从来没有遇到过这样的问题。当你尝试合并时,你遇到了什么样的错误? - gturri
脱口而出,像“没有共同祖先”这样简单的东西。如果我有时间,明天早上我会再看一下。 - JB.
很好的阅读。少了一个需要棘手重写和可见管道的用例。感谢你让我注意到! - JB.

0

如果您可以维护4个仓库,我认为这是使用git-submodules的完美案例。

如果您想将它们合并为一个单独的仓库,您可以将每个仓库用作新仓库上的分支,然后将它们全部合并到一个仓库中。

两个仓库的示例说明

仓库设置(将创建两个仓库,一个在proj/p1/p1中,另一个在proj/p2/p2中)

mkdir -p proj/p1/p1 proj/p2/p2 proj/merged
touch proj/p1/p1/f1 proj/p1/p1/f2 proj/p2/p2/f3
cd proj/p1/p1/ && git init && git add . && git commit -m "proj 1" && cd ../..
cd p2/p2/ && git init && git add . && git commit -m "proj 2" && cd ../..

我们现在将存储库 p1 中的所有代码移动到名为 p1 的文件夹中。

cd p1/p1/ && git rm -r --cached "*" && cd ..
mv p1/.git . && git add . && git commit -m "moved" && cd ..

我们接下来将代码库中的所有代码移动到名为p2的文件夹中。
cd p2/p2/ && git rm -r --cached "*" && cd ..
mv p2/.git . && git add . && git commit -m "moved" && cd ..

现在我们初始化一个全新的仓库merged,以包含所有合并后的代码

cd merged && git init && touch f4 && git add . && git commit -m "init" && cd ..

将此新合并的代码作为远程添加到p1p2,并将主分支中的相应代码推送到远程作为项目名称

cd p1 && git remote add merged ../merged/ && git push merged master:p1 && cd ..
cd p2 && git remote add merged ../merged/ && git push merged master:p2 && cd ..

现在我们可以进入新初始化的仓库并合并分支 p1p2

cd merged && git merge p1 && git merge p2

我们完成了。一个简单的gitkgit log --pretty --oneline 命令将向您展示所有提交。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接