Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么时候需要为“git filter branch”使用“--tag name filter cat”?_Git_Git Filter Branch - Fatal编程技术网

什么时候需要为“git filter branch”使用“--tag name filter cat”?

什么时候需要为“git filter branch”使用“--tag name filter cat”?,git,git-filter-branch,Git,Git Filter Branch,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 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
因此,问题是:

在哪种情况下我需要
--标签名称过滤器cat

还有,但我不知道如何进入这种情况。

您需要“
--tag name filter
”用于
git filter branch
,任何时候您希望它实际更新/创建您的标记,而不是创建那些标记指向的重写提交。为开关提供的命令是一个shell脚本,它获取旧标记名作为输入,并传递给“
--tag name filter
”,以计算出您希望新标记名是什么

例如,如果您有一个名为“work by sun”的标记,并且使用了“
--tag name filter sed s/sun/oracle/
”,那么将创建一个名为“work by oracle”的新标记,而不是更新该标记

更正常的情况是,如果使用“
--tag name filter cat
”,则命令仅为
cat
,并且使用的标记名与原始标记相同-因此标记将被覆盖以指向新提交

命令行参数的“
--all
”部分指定应该重写哪些引用,但除非使用
--tag name过滤器
参数,否则不会更新标记

如果所有这些看起来有点烦躁,你可能想考虑是否能用.

实现你想要的。
充分披露:我是BFG回购清洁剂的作者。

在上述示例中,标签
标签
与参考
参考/原件/refs/tags/tag
是否完全相同?即使没有
--标记名过滤器
,标记
标记
也会指向过滤器分支后的新提交。