手册页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没有重写标签?,但我没有看到,如何进入这种情况.
您需要' --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的作者.