Git 带标签的子目录过滤器

Git Subdirectory Filter with tags

我正试图将一个大型仓库拆分成多个较小的仓库。目标是拆分一个文件夹,保留进程中的标签。

我试过:

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

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

我不知道为什么第二种方法不起作用。如果有任何指点,我将不胜感激!

编辑:

现在试试这个:

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

犹豫不决,因为我预计这需要更长的时间。 这确实需要更长的时间,但它大部分都有效。 什么没有奏效?好吧,尚未创建文件夹的旧标签留在了回购协议中,并且在检出时包含完整(非常)旧的目录结构。我不得不 grep 并删除所有这些标签。 回购仍然没有我预期的那么小......

正如我在“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 存储库。

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