【发布时间】:2018-03-19 15:15:02
【问题描述】:
我有两个现有的 gitlab 项目:带有 branchA 的 projectA 和带有 branchB 的 projectB。 如果可能的话,我想将 branchA 的全部内容移动到 branchB 的目录下,而不会丢失提交历史。
我尝试将这两个项目克隆到一台机器上,将文件从一个分支复制到另一个分支并提交,但随后我丢失了文件历史记录。
如何做到这一点? 谢谢
【问题讨论】:
我有两个现有的 gitlab 项目:带有 branchA 的 projectA 和带有 branchB 的 projectB。 如果可能的话,我想将 branchA 的全部内容移动到 branchB 的目录下,而不会丢失提交历史。
我尝试将这两个项目克隆到一台机器上,将文件从一个分支复制到另一个分支并提交,但随后我丢失了文件历史记录。
如何做到这一点? 谢谢
【问题讨论】:
克隆项目B
git clone git clone <projectB repo URL>
创建一个空的孤立分支
git checkout --orphan temp_branch
git rm -rf .
添加项目A的远程
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 似乎始终存在于其子文件夹中。只是我的意见。
最后注意:当将文件移动到子文件夹时,请确保相应地移动所有隐藏文件(一个一个或一次全部),我只是使用 * 给出了一个简单的示例,但您可能还有一些 .(dot) 文件也需要移动。只要确保不要移动 .git 文件夹。如果您使用的是 windows PC,我还使用 git mv 而不是 mv 来确保与 windows 的兼容性
【讨论】: