我认为这将适用于特定情况。
由于标签引用了他们标记的提交,但没有返回引用,因此该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])
}