我正在使用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上观察过这个。)
答案 0 :(得分:3)
(旁注:--source
将首次达到某些提交的&#34; source&#34;引用添加到git log
输出。)
[有时标签是完全合格的。]为什么会这样,是否可以将其关闭?
Git的所有引用共享一个大名称空间。除特殊情况(HEAD
,MERGE_HEAD
,ORIG_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/blergh
和refs/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)。如果你发现你已经做了这个 - 一个分支和标签同名 - 偶然,取消它。 : - )