0

我们如何使用 go-git 生成在两次提交之间更改的所有文件的列表,类似于git diff --name-only commit1 commit2

对于上下文,我们有一个 git monorepo,它包含一个根go.mod文件但有多个 Go 应用程序。当开发人员将提交推送到分支时,我们希望获取在两次 git 提交之间更改的所有文件的列表 ( git diff --name-only),并将其过滤到应用程序目录列表​​中,同时排除一些目录。我们的最终目标是,我们可以只构建、部署和测试在我们的 monorepo 中发生变化的应用程序。我们有一个与 shippable 类似的 bash 脚本来执行此操作,但我们想使用纯 go 和 go-git。

4

1 回答 1

1

似乎change.Files()只给出了带有 的文件的名称to.Name,而没有给出存储库内的路径,但是change.toString()给出了完整的路径。

所以如果你想使用Tree.Diff,你必须得到这样的路径:

func getChangeName(change *object.Change) string {
        var empty = object.ChangeEntry{}
        if change.From != empty {
            return change.From.Name
        }

        return change.To.Name
}

因此,看起来您可以根据需要选择Tree.DiffPatch.Stats :

    currentTree, err := commit.Tree()
    CheckIfError(err)

    prevTree, err := prevCommit.Tree()
    CheckIfError(err)

    patch, err := currentTree.Patch(prevTree)
    CheckIfError(err)
    fmt.Println("----- Patch Stats ------")

    var changedFiles []string
    for _, fileStat := range patch.Stats() {
        fmt.Println(fileStat.Name)
        changedFiles = append(changedFiles,fileStat.Name)
    }

    changes, err := currentTree.Diff(prevTree)
    CheckIfError(err)
    fmt.Println("----- Changes -----")
    for _, change := range changes {
        // Ignore deleted files
        action, err := change.Action()
        CheckIfError(err)
        if action == merkletrie.Delete {
            //fmt.Println("Skipping delete")
            continue
        }
        // Get list of involved files
        name := getChangeName(change)
        fmt.Println(name)
    }

Patch.Stats将跳过二进制文件,其中Tree.Diff将让您忽略删除。

于 2019-11-18T20:25:57.753 回答