对于上述情况,我们有两种办法解决:
手动迁移合并容易遗漏,也效率低下,最好是使用git patch来实现自动化的迁移。
- 首先,在老的repo中,找到需要迁移的两个 commit 的 hash,例如 8f368259(最新的提交) 和 73bbc19d(老提交)
- 运行 git 指令生成 git diff 文件: git diff 73bbc19d..8f368259 > changes.diff
- 在新的 repo 下,运行指令合并 git apply changes.diff ,如果新的 repo 下也有修改,那么需要三方合并: git apply --3way changes.diff
用上述的方法,可以不遗漏的快速合并所有差异到新的 repo 当中。
上述方法适合源代码目录名没有更改的情况,如果新老repo中,某些源代码文件名目录更改了,会提示错误:
error: xxx/xxx/xxx.xxx: does not exist in index
这种情况下,只能分步骤处理了,对目录变更的单独处理:
git diff HEAD~1 path/to/original/file > patch.diff
然后在应用补丁的时候:
git apply --directory=path/to/new/directory patch.diff
如果需要改变新文件的名称,可以在命令中指定具体的文件名。例如:
git apply --directory=path/to/new/directory --filename=new_file patch.diff
当然,第一步当中,我们如果只是需要对特定的一些文件生成补丁文件也是可以的,不一定要对所有文件生成diff。