首页 > 解决方案 > 提取所有分支的子目录,同时使用 git filter-repo 保留标签

问题描述

我正在尝试将所有分支的 git 存储库的子目录提取到单独的存储库中,同时保留相关标签完整

我已经在网上搜索过,但对于我的特定用例没有成功。

我已经做的是

git filter-repo --subdirectory-filter foo/dir

这适用于所有分支,但不保留标签。这似乎是合理的,因为历史被重写,因此之前创建的标签指向不存在的提交。

似乎有一个使用过时的解决方案git filter-branch,如下所示:

git filter-branch --tag-name-filter cat --subdirectory-filter foo/dir -- --all

但是根据这个 SO question(最后),对于尚未包含要提取的子目录的旧标签,它不能按预期工作。

该问题的公认答案建议使用该--refs参数并显示一个带有一个“参考”(开发分支)的示例。浏览文档,它指出:

将历史重写限制为指定的参考。暗示--部分。除了 --partial 的正常警告(混合新旧历史,不会自动将 refs/remotes/origin/* 重新映射到 refs/heads/* 等),这也可能导致退化空合并的修剪问题指定负面修订时提交。

关于--partial文档状态:

进行部分历史重写,导致新旧历史混合。这意味着 --replace-refs 默认为 update-no-add,禁用将 refs/remotes/origin/* 重写为 refs/heads/*,禁用删除“origin”远程,禁用删除未导出的 refs,禁用过期reflog,并禁用自动后过滤 gc。此外,这会修改 --tag-rename 和 --refname-callback 选项,这样它不会用新的 refnames 替换旧的 refs,而是会创建新的 refs 并保留旧的 refs。谨慎使用。

我认为我不想接受所有那些隐含的“警告”。

不过,我查看的下一个SO 问题使用以下命令解决了该问题:

git filter-repo -f --prune-empty always --subdirectory-filter $subdir --refs $branch $(git tag -l)

这里看起来这个解决方案只适用于一个分支和所有标签。

所以我现在的问题是:是否有可能通过使用提取所有分支的子目录,包括所有标签git filter-repo或者我怎样才能正确实现这种期望的行为?

我的第一个猜测是将所有可用的分支和标签添加到--refs参数中。但是有没有更“优雅”的方式,比如-- --all

非常感谢提前和亲切的问候。

标签: gitgit-filter-branchgit-filter-repo

解决方案


推荐阅读