我有一个我正在观看或改变的git repo。我想知道的一件事是标签是否已经改变了上游。具体来说,我认为标记解析为abc123
(git rev-list -n1 tagname
),但上游已删除标记并在def456
重新创建标记。
即使在我git remote update
之后,我的本地rev-list
也会向我显示abc123
。
我找到了git ls-remote origin tagname
,但这显示的是非abc123
或def456
的哈希值。
为了让事情变得更复杂,我实际上并不知道用户是否给了我一个类似于" HEAD"或者像#34;标记名"或像#34; abc123def456"。 rev-list
很棒,因为它需要所有这些,但不是遥远的。
有没有办法说" XYZ在这个特定的遥控器中解析的是什么哈希"不知道XYZ意味着什么?
答案 0 :(得分:2)
我们知道,有两种标签,带标注的标签(通过-a, -s or -u
创建)和轻量级标签。带注释的标记,如提交,blob或树,是一个具有自己的哈希sha1的git对象。轻量级标签只是对象的名称。标记通常指向提交对象,但它也可以指向标记对象,blob对象或树对象。
假设tagA
是一个带注释的标记,指向master
的当前提示,而tagB
是一个指向同一提交的轻量级标记,git rev-list -n1 <tagA>
或git rev-list -n1 <tagB>
可以显示该提交的sha1。 git ls-remote origin <tagA>
显示tagA
自己的sha1而不是该提交,但git ls-remote origin <tagB>
显示该提交的sha1。
如果您想了解标记指向的内容,可以先运行git fetch origin <tagname>
,然后将其传递给FETCH_HEAD
。 git rev-list -n1 FETCH_HEAD
可以列出它在远程指向的提交sha1,如果它确实指向提交。
答案 1 :(得分:0)
基本上只有两个选项,假设只有标准的Git工具(如果你有非Git工具,特别是你可以编程的工具,你当然可以随心所欲)。这两个选项是:
git fetch
。坚持git ls-remote
,请注意git ls-remote
为您解析标签 1 :
$ git ls-remote origin
[snip]
aaa74e8c5b085572ee6bf3381167c1d428c8d685 refs/heads/pu
8bb94d66bf85d73f8866611161fb6022d68fdf13 refs/heads/todo
d5aef6e4d58cfe1549adef5b436f3ace984e8c86 refs/tags/gitgui-0.10.0
3d654be48f65545c4d3e35f5d3bbed5489820930 refs/tags/gitgui-0.10.0^{}
33682a5e98adfd8ba4ce0e21363c443bd273eb77 refs/tags/gitgui-0.10.1
729ffa50f75a025935623bfc58d0932c65f7de2f refs/tags/gitgui-0.10.1^{}
[snip]
如果您保存所有此输出,则可以在其中扫描分支和标记名称。
分支名称只是refs/heads/*
形式的引用:在这种情况下,远程Git具有分支pu
和todo
。由于分支名称始终指向提交ID,因此这些名称左侧的哈希值是提交哈希值。
标记名称只是表单refs/tags/*
的引用:在这种情况下,标记列表以许多gitgui-*
标记开头。其中每个都是带注释的标记,因此git ls-remote
不仅会显示标记 object ID,例如d5aef6e4d58cfe1549adef5b436f3ace984e8c86
,还会显示该标记对象的目标, 3d654be48f65545c4d3e35f5d3bbed5489820930
。这是第二行输出,显示refs/tags/gitgui-0.10.0^{}
,即gitrevisions
syntax:
后缀为^后跟空括号对意味着该对象可以是标记,并递归取消引用该标记,直到找到非标记对象。
请注意,如果您希望通过git fetch
“重新获取”代码,您可以告诉您的Git强制更新您的代码,或强制将其他Git的代码更新为您自己的私有命名空间(“远程标签”,如果你愿意:见Git - Checkout a remote tag when two remotes have the same tag name)。要使Git强制更新当前标记,请将+refs/tags/*:refs/tags/*
添加到fetch refspecs(在命令行或fetch =
配置条目中)。当然,覆盖当前的标签有明显的缺点,即您不再拥有旧标签。