我使用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)发布于 2021-09-15 12:00:22
我认为这将适用于那个特定的情况。
由于标记有对它们标记的提交的引用,但是没有返回引用,所以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])
}https://stackoverflow.com/questions/69188914
复制相似问题