【问题标题】:go-git how to generate patch for first commit?go-git 如何为第一次提交生成补丁?
【发布时间】:2021-03-31 12:39:37
【问题描述】:

我有以下代码

    commitIter, err := r.Log(&git.LogOptions{From: commit.Hash})
    CheckIfError(err)

    err = commitIter.ForEach(func(c *object.Commit) error {
        parent, err := c.Parent(0)

        if err != nil {
            return nil
        }

        patch, err := c.Patch(parent)
        CheckIfError(err)

        fmt.Println(patch)

        return nil
    })

它遍历所有提交并使用对父级的引用为每个提交生成补丁。但是第一次提交没有父级,然后我无法生成补丁。是否有任何解决方法,例如传递空提交?

我正在搜索,我找到了open pull request on archived go-git repository

【问题讨论】:

  • 我没有接听,但我会尝试致电c.Patch(commit.GetCommit(plumbing.ZeroHash))
  • object.GetCommit 需要两个参数,第一个是storer.EncodedObjectStorer。我应该通过什么?
  • go-git 中的示例表明这是“存储库”。我的意思是,某个“打开”存储库的调用返回的对象。
  • @kostix 我无法解决这个问题 :( 我创建了new issue

标签: git go go-git


【解决方案1】:

使用对象树而不是提交允许您为第一次提交生成补丁。

例如:

    commitTree, err := commit.Tree()
    if err == nil {
        parentTree := &object.Tree{}
        if commit.NumParents() != 0 {
            parent, err := commit.Parents().Next()
            if err == nil {
                parentTree, err = parent.Tree()
                if err == nil {
                    parentTree.Patch(commitTree)
                }
            }
        } else {
            parentTree.Patch(commitTree)
        }
    }

【讨论】:

    猜你喜欢
    • 2011-10-03
    • 2012-09-05
    • 2019-03-23
    • 2013-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多