使用git-filter-repo迁移子目录时误删目标目录的问题
解决git-filter-repo迁移子目录并保留历史的问题
核心错误分析
- 直接在原仓库执行过滤命令,导致原仓库历史被重写,非目标目录被清理消失——永远不要在原仓库做这类历史重写操作,必须先克隆副本。
- 命令里用了系统绝对路径,git-filter-repo需要的是仓库内的相对路径,导致参数解析报错。
--path-rename参数格式错误,正确格式是<旧路径:新路径>,你写的mid-bdd/:不符合要求(而且这里根本不需要用这个参数,--subdirectory-filter足够)。
正确操作步骤
- 克隆原仓库到本地副本(避免破坏原仓库)
git clone <你的BitBucket仓库地址> eid-migrate cd eid-migrate
- 执行子目录过滤,保留目标目录历史
用仓库内的相对路径(从仓库根目录到mid_bdd的路径是bdd/mid_bdd),执行命令:
python C:/Users/USER/Downloads/git-filter-repo.txt --subdirectory-filter bdd/mid_bdd
这个命令会自动保留所有涉及bdd/mid_bdd的提交,并且把该子目录设为新仓库的根目录(即新仓库里直接是原mid_bdd的内容,不再有bdd层级)。
- 推送到GitLab
添加GitLab远程仓库并推送:
git remote add gitlab <你的GitLab仓库地址> git push -u gitlab main
误操作后的恢复
如果已经在原本地仓库执行了错误命令,直接删除本地的eid目录,重新从BitBucket克隆即可——BitBucket上的原仓库内容不会受本地操作影响。
内容的提问来源于stack exchange,提问作者Hinthrix
相关产品推荐
相关产品推荐

