带标签的 Git 子目录过滤器

标签 git split git-tag git-filter-branch

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

我已经尝试过:

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/

相关文章:

git - 为什么 git-filter-branch 没有重写标签?

git - .gitignore 不忽略 .idea 路径

java - 为什么当我尝试添加分割的字符串时得到空字符串?

git - 在 git 中使用 git 标签比空提交有什么优势?

git - 如何验证git中每个提交的作者

git - Teamcity - 成功构建后创建 git 标签

git - 找不到远程 ref HEAD(使用 Jenkins 和 Maven 发布工件时)

git diff : ignore renaming of variables

mysql - 如何将一列拆分为按日期排序的多列

java - 我的 split() 及其正则表达式有什么问题?