登录
首页 >  Golang >  Go问答

检索 Git 历史记录中的关键词与 Golang

来源:stackoverflow

时间:2024-03-13 18:24:27 150浏览 收藏

大家好,我们又见面了啊~本文《检索 Git 历史记录中的关键词与 Golang》的内容中将会涉及到等等。如果你正在学习Golang相关知识,欢迎关注我,以后会给大家带来更多Golang相关文章,希望我们能一起进步!下面就开始本文的正式内容~

问题内容

我想用 go-git 编写一个类似于 git log -g 的脚本

此代码打印存储库的所有提交,但如何获取每个提交添加/删除的行?

package main

import (
    "fmt"
    "os"
    "path/filepath"

    "github.com/go-git/go-git/v5"
    "github.com/go-git/go-git/v5/plumbing/object"
)

func main() {
    if len(os.Args) != 2 {
        fmt.Println("too few arguments. Please specify a directory containing git repos.")
        os.Exit(1)
    }
    err := SearchLog(os.Args[1])
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
}
func SearchLog(dir string) error {
    files, err := os.ReadDir(dir)
    if err != nil {
        return err
    }
    for _, f := range files {
        if f.IsDir() {
            path := filepath.Join(dir, f.Name())
            r, err := git.PlainOpen(path)
            if err != nil {
                fmt.Printf("%s %v", f.Name(), err)
                continue
            }
            err = searchLogInRepo(r)
            if err != nil {
                return err
            }

        }
    }
    return nil
}

func searchLogInRepo(r *git.Repository) error {
    options := git.LogOptions{}
    cIter, err := r.Log(&options)
    if err != nil {
        return err
    }
    err = cIter.ForEach(func(c *object.Commit) error {
        fmt.Println(c)
        return nil
    })
    return err
}

正确答案


单独的 git log -G 不会显示提交内容。

例如,只有 git log -p -G 会。
并且您需要 grep 查找搜索的表达式,以便隔离补丁文本包含添加/删除的与 匹配的行的差异。

对于每个提交,您需要从其父提交获取补丁(如 plumbing/object/commit_test.go 中所示),并查找您的正则表达式。

本篇关于《检索 Git 历史记录中的关键词与 Golang》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>