git - 为什么 "git log --tags=<pattern>"会在输出中添加 "refs/tags"?

标签 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 上观察到了这一点。)

最佳答案

(旁注:--source 将首次到达某个提交的“源”引用添加到 git log 输出。)

[Sometimes the tags are fully-qualified.] Why is this, and is it possible to turn it off?

Git 的所有引用共享一个大 namespace 。除了特殊情况( HEADMERGE_HEADORIG_HEAD 等等)它们都位于顶级目录1 refs/ 下.下一级确定引用的类型:refs/heads/包含分支名称,refs/remotes/包含远程跟踪分支,和refs/tags/包含标签。 (还有用于注释的 refs/notes/ 和用于 refs/stashgit 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/blerghrefs/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/

相关文章:

git - 如何在 git 的 contrib 目录中正确安装工具?

git - 如何将提交从 Gerrit 推送到远程存储库?

git - MacOS Sierra 更新后如何修复 git 路径?

git - 在Powershell中返回Git提交ID

linux - 可以在跨操作系统网络共享上使用 git 吗?

Git 更新 Hook 拒绝非 ASCII 文件名

git - "git difftool"为什么不能直接打开工具?

git - 无法创建临时文件 : no such file or directory - only for certain files?

git - 删除git分支会失去审核

git - 在一次运行中删除多个分支