git2go : Listing files with the latest committer and commit date

标签 git go libgit2

我正在尝试使用 git2go 输出文件列表,以及它们在存储库中的最新作者和最近提交日期。使用 tree.Walk 循环访问文件似乎很简单:

package main

import (
    "time"

    "gopkg.in/libgit2/git2go.v25"
)

// FileItem contains enough file information to build list
type FileItem struct {
    AbsoluteFilename string    `json:"absolute_filename"`
    Filename         string    `json:"filename"`
    Path             string    `json:"path"`
    Author           string    `json:"author"`
    Time             time.Time `json:"updated_at"`
}

func check(err error) {
    // ...
}

func getFiles(path string) (files []FileItem) {

    repository, err := git.OpenRepository(path)
    check(err)

    head, err := repository.Head()
    check(err)

    headCommit, err := repository.LookupCommit(head.Target())
    check(err)

    tree, err := headCommit.Tree()
    check(err)

    err = tree.Walk(func(td string, te *git.TreeEntry) int {

        if te.Type == git.ObjectBlob {

            files = append(files, FileItem{
                Filename: te.Name,
                Path:     td,
                Author:   "Joey",     // should be last committer
                Time:     time.Now(), // should be last commit time

            })

        }
        return 0
    })
    check(err)

    return
}

我无法解决的问题是,我应该采用哪种方法?我可以在传递给 tree.Walk 的函数中,根据 git.TreeEntry 的有限信息计算提交吗?或者我是否需要单独构建一个提交列表以及相关文件并以某种方式交叉引用它们?

最佳答案

log example显示如何按路径过滤 revwalk。它涉及将每个提交与它的父项进行比较,并将路径作为 pathspec 参数。这不是微不足道的。

关于git2go : Listing files with the latest committer and commit date,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42564667/

相关文章:

git - 在不 merge 的情况下使用 master 更新 git 分支

testing - Golang 测试在详细模式下运行时给出不一致的结果

c - 如何检索所有对象 ID?

mysql - 我们如何使用 go 例程同时运行查询?

libgit2 - 如何使用libgit2从git获取?

c++ - 如何使用 LibGit2 C++ 列出分支?

git - 如何在 git rebase 期间通过哈希识别冲突提交?

git - 如何让 emacs 使用 git 的文本着色?

GIT: pull 请求和 merge 之间有什么区别?

string - 如何找到跳过 N 个字符的子串