检测遥控器上已更改的标签

时间:2016-08-21 05:51:26

标签: git

我有一个我正在观看或改变的git repo。我想知道的一件事是标签是否已经改变了上游。具体来说,我认为标记解析为abc123git rev-list -n1 tagname),但上游已删除标记并在def456重新创建标记。

即使在我git remote update之后,我的本地rev-list也会向我显示abc123

我找到了git ls-remote origin tagname,但这显示的是非abc123def456的哈希值。

为了让事情变得更复杂,我实际上并不知道用户是否给了我一个类似于" HEAD"或者像#34;标记名"或像#34; abc123def456"。 rev-list很棒,因为它需要所有这些,但不是遥远的。

有没有办法说" XYZ在这个特定的遥控器中解析的是什么哈希"不知道XYZ意味着什么?

2 个答案:

答案 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_HEADgit rev-list -n1 FETCH_HEAD可以列出它在远程指向的提交sha1,如果它确实指向提交。

答案 1 :(得分:0)

基本上只有两个选项,假设只有标准的Git工具(如果你有非Git工具,特别是你可以编程的工具,你当然可以随心所欲)。这两个选项是:

  1. 使用ElpieKay's answer中已描述的git fetch
  2. 坚持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]
    
  3. 如果您保存所有此输出,则可以在其中扫描分支和标记名称。

    分支名称只是refs/heads/*形式的引用:在这种情况下,远程Git具有分支putodo。由于分支名称始终指向提交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 =配置条目中)。当然,覆盖当前的标签有明显的缺点,即您不再拥有旧标签。