如何将GitHub分支中的文件夹切割到同分支下另一文件夹并保留提交历史
将分支内文件夹切割到同分支下另一文件夹并保留历史的方法
你可以用Git底层命令构造提交来实现,思路和你之前切割到新分支的逻辑类似,只是要基于当前分支的HEAD构造新提交,将源文件夹的内容迁移到目标路径,同时保留分支原有内容(或移除源文件夹,实现“切割”)。具体步骤如下:
- 克隆仓库并切换到目标分支:
git clone <仓库地址> git switch 目标分支名
- 获取当前分支的树对象、源文件夹的树对象:
current_tree=$(git rev-parse HEAD^{tree}) source_tree=$(git rev-parse HEAD:源文件夹名)
- 构造新的树对象:移除当前树里的源文件夹,同时将源文件夹的内容映射到目标路径下:
new_tree=$(git mktree <<EOF $(git ls-tree -r $current_tree | grep -v "^[^ ]* 源文件夹名/") $(git ls-tree -r $source_tree | sed "s/ / 目标文件夹名\//") EOF )
- 基于新树对象创建提交,父节点为当前分支的HEAD:
new_commit=$(git commit-tree $new_tree -p HEAD -m "将源文件夹迁移到目标文件夹(保留历史)")
- 更新当前分支的引用到新提交:
git update-ref refs/heads/目标分支名 $new_commit
- 验证并推送更改:
git status git push origin 目标分支名
执行完成后,你可以用git log --follow -- 目标文件夹名查看迁移后的历史,会看到源文件夹的原有提交记录被继承过来。
注意:替换命令中的<仓库地址>、目标分支名、源文件夹名、目标文件夹名为实际名称。如果不需要保留源文件夹,上述命令已经通过grep -v移除了源文件夹的内容;如果要保留源文件夹,去掉grep -v "^[^ ]* 源文件夹名/"这部分即可。
内容的提问来源于stack exchange,提问作者tarekahf
相关产品推荐
相关产品推荐

