如何识别在git commit之间更改了哪些文件

问题描述 投票:-1回答:1

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

对于上下文,我们有一个git monorepo,其中包含一个根go.mod文件,但包含多个Go应用程序。当开发人员将提交推送到分支时,我们希望获得在两个git commit(git diff --name-only)之间更改的所有文件的列表,并将其过滤到应用程序目录列表​​中,同时排除某些目录。我们的最终目标是,我们可以仅构建,部署和测试在monorepo内部发生更改的应用程序。我们有一个bash script similar to this one from shippable可以做到这一点,但是我们想使用纯go和go-git。

git go continuous-delivery monorepo go-git
1个回答
0
投票

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将使您忽略删除。

© www.soinside.com 2019 - 2024. All rights reserved.