如何将 N 个 Git 存储库合并为一个,同时保留它们的历史记录?

3
我有一个项目,由几个独立的Git存储库组成(将几个具有单独Git存储库的Maven项目合并)。
现在我想创建一个Git存储库,并将每个存储库的内容放入其子目录中,保留它们各自的历史记录(将几个Maven项目合并为一个多模块Maven项目)。
我该怎么做?
我试图应用类似SO问题的答案:
1. 我们称单个存储库为P1-PN,统一存储库为U。 2. 创建存储库U。 3. 在U中创建分支P1git checkout -b P1)。 4. 在P1目录中,运行命令git remote add U git@myuser.beanstalkapp.com:/U.git。 5. 在P1目录中,运行git push U P1命令。
当我执行此操作时,在最后一步中出现以下错误:
error: src refspec ccplogic does not match any.
error: failed to push some refs to 'git@myuser.beanstalkapp.com:/U.git'

那个问题不同:你想要合并树。将所有对象拉入一个仓库是正确的做法,但是然后你需要将树拼接在一起并将其保存为提交。我不确定是否有一种简单的方法来完成这个过程,而且据我所知,使用管道方式也相当麻烦。至少对于你来说,推送步骤是错误的:没有东西可以推送。 - Rup
1个回答

2
一种方法是将每个仓库作为一个Git子模块添加,但看起来您想要一个单一的仓库。
您可以使用名为git-subtree的脚本创建一个包含所有其他仓库历史记录的单一仓库,该脚本现在是主线Git的一部分,尽管位于contrib目录中。要安装git-subtree脚本,请将其保存为名称为git-subtree的文件,并将其放置在您的PATH上。(如果成功了,那么git subtree应该会给您显示一个用法消息。)
假设您使用类似以下命令创建了一个新的空仓库:
mkdir example
cd example
git init
touch .gitignore
git add .gitignore
git commit -m 'Initial commit'

然后,对于每个其他的仓库,您可以执行以下操作(假设该仓库位于URL git://wherever/whatever.git,并且您想要其master分支出现在子目录whevs中):

git remote add whevs-remote git://wherever/whatever.git
git fetch whevs-remote
git subtree add --prefix=whevs whevs-remote/master

然后对每个其他的存储库执行相同的操作。


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