带有标记的 Git 子目录过滤器



我正在尝试将一个大型存储库拆分为多个较小的存储库。目标是拆分文件夹并在此过程中保留标签。

我试过:

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

这导致开发分支与旧的目录结构一起存在,但是当我签出标签时,我看到子目录正确过滤到根目录!所以标签是正确的,但不是开发分支。基本上它与第一种方法具有相反的问题。

我不知道为什么第二种方法不起作用。我真的很感激任何指示!

编辑:

现在试试这个:

git filter-branch --tag-name-filter cat --prune-empty --subdirectory-filter my-folder -- --all

犹豫不决,因为我预计这将需要更长的时间。 这确实需要更长的时间,但它基本上有效。 什么不起作用?好吧,尚未创建文件夹的旧标记保留在存储库中,并且在签出时包含完整(非常(旧的目录结构。我不得不 grep 并删除所有这些标签。 回购仍然没有我预期的那么小......

正如我在"可能破坏/重写历史记录的 Git 命令"中提到的,旧的 git filter-branch 命令正在慢慢被弃用。

使用新git filter-repo,这将是:

git filter-repo --path my-folder/ --to-subdirectory-filter / -- refs develop

然后将该分支推送到新的空 Git 存储库。

这应该正确移动相关标签。

最新更新