为什么&#34; git log --tags = <pattern>&#34;添加&#34;参考/标签&#34;输出?

时间:2016-09-23 15:59:52

标签: git

我正在使用git log --source --tag=<pattern>将输出限制为某些标记并显示这些标记。它使用refs/tags/对显示的代码进行限定,但如果没有模式,--tag就不会这样做(或者我根本不指定--tag)。

为什么会这样,是否有可能将其关闭?

$ git init
Initialised empty Git repository in /tmp/repo/.git/
$ touch new-file
$ git add new-file
$ git commit -m "Added new file new-file"
[master (root-commit) c151765] Added new file new-file
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 new-file
$ git tag TEST-TAG
$ git log --oneline --source --tags
c151765 TEST-TAG Added new file new-file
$ git log --oneline --source --tags=*
c151765 refs/tags/TEST-TAG Added new file new-file

(我在git 1.9.1和2.1.0上观察过这个。)

1 个答案:

答案 0 :(得分:3)

(旁注:--source将首次达到某些提交的&#34; source&#34;引用添加到git log输出。)

  

[有时标签是完全合格的。]为什么会这样,是否可以将其关闭?

Git的所有引用共享一个大名称空间。除特殊情况(HEADMERGE_HEADORIG_HEAD等)外,它们都位于顶级目录 1 refs/之下。下一级确定引用的类型refs/heads/包含分支名称,refs/remotes/包含远程跟踪分支,refs/tags/包含标记。 (对于refs/notes/,还有refs/stash个注释和git stash,它只是一个文件而不是目录。)

使用--branches=<pattern>--glob=<pattern>--remotes=<pattern>--tags=<pattern>时,您最终会看到全名。在某种程度上,使用--tags(或--branches--remotes时,发现此不会发生会更有趣; #39; s不等同于--glob)。不过,原因是it's an implementation quirk。如果您检查链接代码,您会看到--tags=变体(位于突出显示部分底部)将明确refs/tags/传递给for_each_glob_ref_in,而--tags变体(在顶部)没有。

实际上有两个源代码模式相同的源文件。我认为,这个怪癖在builtin/rev-parse.c中实际上更加清晰,但git log的注释是由revision.c中的代码引起的。

由于它在源代码中是硬编码的,答案是否定的,你不能将其关闭,你只能在事后修改它。

请注意,如果您使用--source --branches --tags,并且您的分支和标记名称与 2 匹配 - 例如refs/heads/blerghrefs/tags/blergh - 您会看到:

f0b2db2 blergh do something or other

您无法判断blergh是分支名称还是标记名称。

1 当引用打包时,即存储在.git/packed-refs中,此&#34;目录&#34;概念只是概念性的,但最初,现在仍然在解压缩引用时,这实际上是一个目录:如果您查看了.git目录,您会发现refs/包含refs/heads/等等。

2 一般来说,这是一个坏主意。这一切都按照规则运作,但规则可能令人困惑。特别是,gitrevisions表示标记首先出现,并且它与大多数Git命令(例如git show)一起使用,但git checkout不同意并将检出分支,而不是标记(实际上是有道理的:要签出标签,你可以写refs/tags/blergh,但做git checkout refs/heads/blergh可以获得一个独立的HEAD)。如果你发现你已经做了这个 - 一个分支和标签同名 - 偶然,取消它。 : - )