我正在尝试将一个大型存储库拆分为多个较小的存储库。目标是拆分文件夹并在此过程中保留标签。
我已经尝试过:
git filter-branch --prune-empty --subdirectory-filter my-folder develop
这正确地将 my-folder
放置在新项目的根目录中,并保留了标签。然而,检查标签会导致在新存储库中看到整个旧目录结构。
所以我尝试了:
git filter-branch --tag-name-filter cat --prune-empty --subdirectory-filter my-folder -- --branches=develop --tags
这会导致开发分支具有旧的目录结构,但是当我 checkout 标签时,我看到子目录已正确过滤到根目录!所以标签是正确的,但开发分支不正确。基本上它的问题与第一种方法相反。
我不知道为什么第二种方法不起作用。我真的很感激任何指点!
编辑:
现在尝试一下:
git filter-branch --tag-name-filter cat --prune-empty --subdirectory-filter my-folder -- --all
我很犹豫,因为我预计这会花费更长的时间。 这确实花费了更长的时间,但基本上有效。 什么没有奏效?好吧,尚未创建文件夹的旧标签留在存储库中, checkout 时包含完整(非常)旧的目录结构。我必须 grep 并删除所有这些标签。 不过, repo 协议(protocol)并不像我预期的那么小......
最佳答案
正如我在“Git commands that could break/rewrite the history”中提到的,旧的 git filter-branch 命令正在慢慢被弃用。
使用新的 git filter-repo
,那就是:
git filter-repo --path my-folder/ --to-subdirectory-filter / -- refs develop
然后将该分支推送到新的空 Git 存储库。
这应该正确移动相关标签。
关于带标签的 Git 子目录过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58394471/