它并不像你想的那么简单。您当前有两个存储库,每个存储库都有自己的历史记录。
每个提交都有一个明确定义的父级。
要获得单一的、按时间顺序正确的历史记录,您必须更改大量提交的父级。
一个简短的示例说明了这一点:
存储库“配置”:
A <- C <- E
存储库“src”
B <- D <- F
假设提交 B 发生在 A 之后,C 之后 B 等等,所以你想要这个结果:
A <- B' <- C' <- D' <- E' <- F'
要实现这一点,您必须更改 to 的父B'
级A
。的父级C'
必须从更改A
为B'
等。
这不是微不足道的。但有可能。
假设配置存储库位于“/usr/git/config”,src 存储库位于“/usr/git/config/src”。
首先,我们必须准备“src”存储库以包含“src”子文件夹中的所有文件:
- CD 到“/usr/git/config/src”
执行这个怪物:
git filter-branch --index-filter 'git ls-files -s | sed "s-\t\"*-&src/-" | GIT_INDEX_FILE=$GIT_INDEX_FILE.new git update-index --index-info && mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"' HEAD
其余的现在将发生在“config”存储库中,因此 CD 到“/usr/git/config”。
- 将“src”存储库添加为远程:
git remote add src /usr/git/config/src
- 获取“src”存储库的提交:
git fetch src
- 将来自“src/master”的提交与本地“master”合并:
git merge src/master master
- 找出两个存储库的初始提交:
git rev-list --max-parents=0 --pretty HEAD
- 注意两者中较旧的提交哈希
- 执行完整存储库的变基以摆脱合并:
git rebase -f <hash from step 5>
- 移除遥控器:
git remote remove src
- 删除文件夹“/usr/git/config/src/src”和“/usr/git/config/src/.git”
- 更新 .gitignore 以不再忽略“src”文件夹。
请注意:
这假设您在两个存储库中都只有一个主分支。
哦,并且:请在执行此操作之前进行备份。我只在一个小型测试存储库上对其进行了测试,每个存储库有两个提交......
如果你在 src 子文件夹中只有一个存储库,那就更简单了,只需执行以下命令:
- CD 到“/usr/git/config/src”
- 从上面执行怪物
- 将“/usr/git/config/src”重命名为“/usr/git/config/src_tmp”
- 将“/usr/git/config/src_tmp”的完整内容移动到“/usr/git/config”,包括“.git”存储库
- 删除现在为空的“/usr/git/config/src_tmp”