【问题标题】:detecting a changed tag on a remote检测遥控器上的更改标签
【发布时间】:2016-12-27 22:12:32
【问题描述】:

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

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

我找到了git ls-remote origin tagname,但它显示的哈希值既不是abc123,也不是def456

为了让事情变得更复杂一些,我实际上不知道用户是否给了我一个类似“HEAD”的 rev 或类似“tagname”的 rev 或类似“abc123def456”的 rev。 rev-list 很棒,因为它需要所有这些,但不需要遥控器。

在不知道 XYZ 是什么意思的情况下,有没有办法说“XYZ 在这个特定的遥控器中会解析成什么哈希”?

【问题讨论】:

    标签: git


    【解决方案1】:

    众所周知,标签有两种,注释标签(通过-a, -s or -u创建)和轻量级标签。带注释的标签,如提交、blob 或树,是一个 git 对象,具有自己的哈希 sha1。轻量级标签只是对象的名称。一个标签通常指向一个提交对象,但它也可以指向一个标签对象、一个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,如果它确实指向一个提交。

    【讨论】:

      【解决方案2】:

      假设只有标准的 Git 工具,你基本上只有两个选择(如果你有非 Git 工具,尤其是那些你可以编程的工具,你当然可以做任何你喜欢的事情)。这两个选项是:

      1. 使用git fetch,如ElpieKay's answer 中所述。
      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]
        

      如果保存所有这些输出,则可以扫描它以查找分支和标记名称。

      分支名称只是 refs/heads/* 形式的引用:例如,在这种情况下,远程 Git 具有分支 putodo。由于分支名称始终指向提交 ID,因此这些名称左侧的哈希是提交哈希。

      标签名称只是refs/tags/* 形式的引用:在这种情况下,标签列表以许多gitgui-* 标签开头。其中每一个都是一个带注释的标签,因此git ls-remote 不仅显示标签object ID,例如d5aef6e4d58cfe1549adef5b436f3ace984e8c86,还显示该标签对象的target3d654be48f65545c4d3e35f5d3bbed5489820930。这是第二行输出,显示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 = 配置条目中)。当然,覆盖您当前的标签确实有一个明显的缺点,即您不再拥有旧标签。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-07
        • 1970-01-01
        • 2012-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多