1

我正在使用 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)
4

1 回答 1

2

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

由于标签引用了他们标记的提交,但没有返回引用,因此该getTags函数返回 amap反转该关系并允许我们找到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])
}
于 2021-09-15T12:00:21.830 回答