【问题标题】:How to get the git tags for a particular hash in go using go-git package to get an output similar to git describe --tags --always如何使用 go-git 包获取特定哈希的 git 标签以获取类似于 git describe --tags --always 的输出
【发布时间】:2021-11-10 07:04:29
【问题描述】:

我正在使用 go-git 包获取标签,在使用函数“TagObject”时,它返回 null。 应该怎么写?

实际文件:

hashCommit, _ := r.Head()
tagObj, _ := r.TagObject(hashCommit.Hash())

测试文件:

tags, err := testAppDir.Tags()
                    h.AssertNil(t, err)
                    tags.ForEach(func(t *plumbing.Reference) error {
                        fmt.Println("the tag inside test", t)
                        return nil
                    })

如何在我的实际文件中获取标签? 错误:

  - "describe": string(""),
 + "describe": (*object.Tag)(nil)

【问题讨论】:

  • 您能否扩展您的示例以便我们运行它?即显示导入,r var attribution...
  • r 这里代表存储库。 r, error := git.PlainOpen(appPath) 导入了这个包:“gopkg.in/src-d/go-git.v4”
  • 您在寻找带注释的标签还是轻量级标签?
  • 带注释的标签,如果我没记错的话。需要git describe --tags --always返回的值返回“v0.18.1-2-g83484845”
  • 我认为您应该将您的问题改写为 using go-git to get an output类似于git describe --tags --always 然后您留下文本以显示您所做的事情迄今为止。我必须告诉你,要模仿那个命令需要一些努力。 注意: --tags 表示任何标签,无论是轻量级的还是带注释的

标签: go go-git


【解决方案1】:

我认为这适用于特定情况。

由于标签引用了他们标记的提交,但没有返回引用,getTags 函数返回一个 map,它反转了该关系并允许我们找到附加到提交的 tag (请注意,假设提交只有一个标签,这可能不是真的)。​​

然后我们获取该地图并查看头部是否有标签,如果有则打印它。否则,我们将从头开始遍历日志并搜索第一个标记提交。如果我们找到任何内容,我们将打印标签和提交的简短版本(似乎没有获得可靠短哈希的方法,所以我取了前 8 个字符)

最后,如果没有找到,则使用前面描述的方法打印短哈希。

这是一个幼稚的实现,可能会对带有大量标签的存储库产生问题。

请注意,我使用的是 go-git 的更新版本。

package main

import (
    "errors"
    "fmt"
    "github.com/go-git/go-git/v5"
    "github.com/go-git/go-git/v5/plumbing"
    "io"
    "log"
)

func getTags(r *git.Repository) (map[plumbing.Hash]string, error) {
    tags := make(map[plumbing.Hash]string)

    iter, err := r.Tags()
    if err != nil {
        return nil, err
    }

    for {
        ref, err := iter.Next()
        if errors.Is(err, io.EOF) {
            break
        }
        if err != nil{
            return nil, err
        }
        tags[ref.Hash()] = ref.Name().Short()

    }
    return tags, nil
}

func main() {
    appPath := "" 
    r, err := git.PlainOpen(appPath)

    if err != nil {
        log.Fatal(err)
    }
    hashCommit, err := r.Head()
    if err != nil {
        log.Fatal("head", err)
    }
    fmt.Println("hash", hashCommit)

    tags, err := getTags(r)

    // check if last commit is tagged
    if str, ok := tags[hashCommit.Hash()]; ok {
        fmt.Println(str)
        return
    }

    // check if any commit is tagged
    cIter, err := r.Log(&git.LogOptions{From: hashCommit.Hash()})
    for {
        commit, err := cIter.Next()
        if errors.Is(err, io.EOF) {
            break
        }
        if err != nil{
            log.Fatal(err)
        }

        if str, ok := tags[commit.Hash]; ok {
            fmt.Printf("%s-%s\n", str, hashCommit.Hash().String()[:8])
            return
        }
    }

    fmt.Println(hashCommit.Hash().String()[:8])
}

【讨论】:

    猜你喜欢
    • 2018-03-13
    • 2012-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-20
    • 2011-08-07
    • 2013-05-01
    • 2015-07-01
    相关资源
    最近更新 更多