首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用go-git包获取go中特定散列的git标记,以获得类似于git describe - tags --always的输出

如何使用go-git包获取go中特定散列的git标记,以获得类似于git describe - tags --always的输出
EN

Stack Overflow用户
提问于 2021-09-15 07:39:57
回答 1查看 190关注 0票数 1

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

实际文件:

代码语言:javascript
复制
hashCommit, _ := r.Head()
tagObj, _ := r.TagObject(hashCommit.Hash())

测试文件:

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

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

代码语言:javascript
复制
  - "describe": string(""),
 + "describe": (*object.Tag)(nil)
EN

回答 1

Stack Overflow用户

发布于 2021-09-15 12:00:22

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

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

然后我们拿着地图,看看头部是否有标签,如果有,就打印出来。否则,我们将从头部开始遍历日志,并搜索第一个标记的提交。如果找到,我们将打印标签和提交的简短版本(似乎没有一种方法可以获得可靠的简短散列,所以我取了前8个字符)

最后,如果没有找到任何内容,则使用前面描述的方法打印短散列。

这是一个天真的实现,可能会在包含大量标签的存储库中出现问题。

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

代码语言:javascript
复制
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])
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69188914

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档