我有两个现有的gitlab项目:projectA with branchA,projectB with branchB。 我想将branchA的全部内容移动到branchB的目录下,如果可能的话,不会丢失提交历史记录。
我尝试将两个项目克隆到一台机器上,将文件从一个分支复制到另一个分支并提交,但后来我丢失了文件历史记录。
如何做到这一点? 感谢
答案 0 :(得分:0)
克隆项目B
git clone git clone <projectB repo URL>
创建一个空的孤儿分支
git checkout --orphan temp_branch
git rm -rf .
添加projectA远程
git remote add -f projectA <projectA repo URL>
将 temp_branch 与projectA的branchA合并
git merge projectA/branchA --allow-unrelated-histories
此时您可以按原样移动内容,也可以重写历史记录,使这些文件看起来始终位于子文件夹中。
注意: 您必须选择其中一个或另一个选项1或选项2.然后您可以正常继续其余步骤。
将 temp_branch 的内容移至子文件夹并提交(不重写 - 选项1)
mkdir projectA
git mv -k * projectA/
git add .
git commit -m "Move projectA/branchA to sub folder"
将 temp_branch 的内容移至子文件夹并提交(使用重写 - 选项2)
git filter-branch --tree-filter "mkdir projectA;git mv -k * projectA" HEAD
与projectB / branchB合并
git checkout branchB
git merge temp_branch --allow-unrelated-histories
删除 temp_branch 和projectA远程
git branch -D temp_branch
git remote remove projectA
推送到 projectB 远程(确保您在branchB上)
git checkout branchB
git push origin branchB
你应该合并两者,同时保留两个分支的git历史记录。由于历史不相关,我建议使用选项2,因为它以一种似乎projectA始终存在于其子文件夹中的方式重写历史记录。只是我的意见。
最后注意: 在将文件移动到子文件夹时,请确保相应地移动任何隐藏文件(一个接一个或一次移动),我只是使用*给出一个简单的例子,但你可能有一些。(点)文件也需要移动。只是确保不要移动.git文件夹。如果你使用的是Windows PC,我还使用git mv而不是mv来确保与windows的兼容性