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

mic*_*has 18 git git-filter-branch

手册页git filter branch说:

use "--tag-name-filter cat" to simply update the tags.
Run Code Online (Sandbox Code Playgroud)

后来甚至说:

use --tag-name-filter cat -- --all
Run Code Online (Sandbox Code Playgroud)

但是--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
Run Code Online (Sandbox Code Playgroud)

因此问题:

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

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

Rob*_*ley 22

您需要' --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的作者.

  • 在上面的示例中,标记“ tag”是否与ref“ refs / original / refs / tags / tag”完全相同?即使没有`--tag-name-filter`,标签`tag`也指向过滤器分支之后的新提交。 (3认同)