什么情况下需要使用 `--tag-name-filter cat` 命令来执行 `git filter-branch`?

23

git filter-branch 的 man 手册上写道:

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个回答

29
每当你想要更新/创建标签时,而不是只创建指向重写提交的那些标签时,都需要使用'--tag-name-filter'来配合git filter-branch。你提供的带有开关的命令是一个shell脚本,以旧标签名称为输入,并使用传递给'--tag-name-filter'的命令来确定新标签名称,git-filter-branch使用该命令

例如,如果您有一个名为'work-by-sun'的标签,并使用'--tag-name-filter sed s/sun/oracle/',则不会更新标签,而是创建一个名为'work-by-oracle'的新标签。
更通常地,如果您使用'--tag-name-filter cat',那么命令就是cat,并且使用的标签名称与原始标签相同-因此标签被覆盖以指向提交。
命令行参数中的'--all'部分指定了应重写哪些引用,但是标签除非使用--tag-name-filter参数,否则不会得到更新。
如果所有这些看起来有点棘手,您可能需要考虑是否可以使用BFG Repo-Cleaner来实现您想要的东西。 完全披露:我是BFG Repo-Cleaner的作者。

3
在上面的例子中,标签 tag 不就是指向 refs/original/refs/tags/tag 的引用吗?即使没有使用 --tag-name-filter,标签 tag 也会指向 filter-branch 后的新提交。 - michas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接