git - 如何识别git提交之间哪些文件已更改

标签 git go continuous-delivery monorepo go-git

我们如何使用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。

最佳答案

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

关于git - 如何识别git提交之间哪些文件已更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58905690/

相关文章:

c# - 使用 octokit.net 从 GitHub 下载代码

go - 如何确定 fmt.Fscanf 消耗的空白数量?

go - 连接后Go TCP服务器始终抛出EOF

jenkins - 让 Ansible 和 Rundeck 一起工作是一个好主意,还是使用任何一个就足够了?

continuous-integration - Gitlab CI : run job only if artifact exists

amazon-web-services - 在 AWS-CodePipeline 管道中使用两个源

git - 提交:有没有办法覆盖标准 `git commit` ?

windows - 如何批量删除 stashes?

git - SmartGit/Git中如何撤销commit操作

go - 你如何传递一片 *interface{} 作为参数?