我正在使用 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 上观察到了这一点。)
最佳答案
(旁注:--source
将首次到达某个提交的“源”引用添加到 git log
输出。)
[Sometimes the tags are fully-qualified.] Why is this, and is it possible to turn it off?
Git 的所有引用共享一个大 namespace 。除了特殊情况( 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
; --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
中,这个“目录”概念只是概念性的,但最初,直到今天,当引用被解压时,这确实是一个目录:如果你查看你的 .git
目录,你会发现refs/
其中包含 refs/heads/
等等。
2总的来说这是个坏主意。一切都按规则进行,但规则可能会令人困惑。特别是, gitrevisions
表示标签在前,大多数 Git 命令(例如 git show
)也是如此,但是 git checkout
不同意并将检查分支,而不是标签(这实际上是有道理的:要检查标签,你可以写 refs/tags/blergh
但做 git checkout refs/heads/blergh
会让你得到一个分离的 HEAD)。如果您发现您无意中这样做了——用相同的名称创建了一个分支和标签——请撤消它。 :-)
关于git - 为什么 "git log --tags=<pattern>"会在输出中添加 "refs/tags"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39665039/