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

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

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


不负相思意
浏览 99回答 1
1回答

慕丝7291255

看起来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.Diff或Patch.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将让您忽略删除。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go