你什么时候需要`-tag-name-filter cat`用于`git filter-branch`?

 狗狗狗699_250 发布于 2023-02-05 05:20

手册页git filter branch说:

use "--tag-name-filter cat" to simply update the tags.

后来甚至说:

use --tag-name-filter cat -- --all

但是--all应该包括--tags,因此所有标签都应该被正确地重写.

一个小测试验证了这一点:

$ git init
$ mkdir dir
$ touch dir/file
$ git add .
$ git commit -am init
$ git ls-files
dir/file
$ git tag tag
$ git for-each-ref
3006eb0a031e40901122ac8984c85ad533982f8b commit refs/heads/master
3006eb0a031e40901122ac8984c85ad533982f8b commit refs/tags/tag
$ git filter-branch --subdirectory-filter dir -- --all
Rewrite 3006eb0a031e40901122ac8984c85ad533982f8b (1/1)
Ref 'refs/heads/master' was rewritten
Ref 'refs/tags/tag' was rewritten
$ git for-each-ref
8e5f09c93a2fbdb435dbe7019abeb841cb5857b2 commit refs/heads/master
3006eb0a031e40901122ac8984c85ad533982f8b commit refs/original/refs/heads/master
3006eb0a031e40901122ac8984c85ad533982f8b commit refs/original/refs/tags/tag
8e5f09c93a2fbdb435dbe7019abeb841cb5857b2 commit refs/tags/tag

因此问题:

我需要在哪种情况下--tag-name-filter cat

还有为什么git-filter-branch没有重写标签?,但我没有看到,如何进入这种情况.

1 个回答
  • 您需要' --tag-name-filter' git filter-branch任何时候您希望它实际更新/创建您的标记 - 而不是仅仅创建这些标记指向的重写提交.您提供交换机的命令是一个shell脚本,它将标记名称作为输入,git-filter-branch使用传递给' --tag-name-filter' 的命令来计算出您想要新标记名称的内容.

    例如,如果你有一个名为'work-by-sun'并使用' --tag-name-filter sed s/sun/oracle/'的标签,那么不会更新标签,而是创建一个名为'work-by-oracle'的新标签.

    更常见的是,如果使用' --tag-name-filter cat',则命令只是cat,并且使用的标记名称与原始标记相同 - 因此标记将被覆盖以指向提交.

    --all命令行参数的' '部分指定应该重写哪些refs,但除非使用参数,否则标签不会更新--tag-name-filter.

    如果所有这些看起来有点繁琐,您可能想要考虑是否可以使用BFG Repo-Cleaner达到您想要的效果.

    完全披露:我是BFG Repo-Cleaner的作者.

    2023-02-05 05:43 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有