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 没有重写标签?,但我不清楚如何陷入这种情况。
tag
不就是指向refs/original/refs/tags/tag
的引用吗?即使没有使用--tag-name-filter
,标签tag
也会指向 filter-branch 后的新提交。 - michas