为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

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

1 回答

?
慕丝7291255

TA贡献1859条经验 获得超6个赞

看起来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将让您忽略删除。



查看完整回答
反对 回复 2023-08-07
  • 1 回答
  • 0 关注
  • 58 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信