【问题标题】:How to identify which files have changed between git commits如何识别 git 提交之间哪些文件已更改
【发布时间】:2020-03-13 07:10:27
【问题描述】:

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

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

【问题讨论】:

  • 您可能需要使用 Tree.Diff 自己构建它。
  • 我也更新了你的标题以匹配新问题。
  • TBH,对于多个应用程序来说,拥有一个 repo 一开始对我来说听起来很奇怪。有多个存储库,每个存储库都有自己的 CI,如果绝对必须,有一个“父”存储库,其中包含其他存储库为 submodules。此外,鉴于 Go 编译器针对编译速度进行了显式优化(而且我很少看到任何 Go 程序的编译时间超过几秒钟),我看不到它的优势。就像在“at all”中一样。
  • TBH,我同意@MarkusWMahlberg 的观点,但我的任务是让 monorepo 工作,而不是决定是否这样做。

标签: git go continuous-delivery monorepo go-git


【解决方案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 会让你忽略删除。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 1970-01-01
    • 2019-12-07
    • 2017-05-09
    • 1970-01-01
    • 2011-03-09
    相关资源
    最近更新 更多