Search code examples
gitgogithubgo-github

Failing to create a commit using go-github with 422 - Update is not a fast forward


I am using the following function to simply create a new commit in a branch using go-github library

func GHAPICreateCommit(ctx context.Context, client *github.Client, commitOpts *CommitOptions) error {
    // Get the reference of the branch
    ref, _, err := client.Git.GetRef(ctx, repoOwner, commitOpts.Repo, "refs/heads/"+commitOpts.Branch)
    if err != nil {
        return err
    }
    commit, _, err := client.Git.GetCommit(ctx, repoOwner, commitOpts.Repo, *ref.Object.SHA)
    if err != nil {
        return err
    }

    commit.Message = github.String(commitOpts.CommitMessage)

    // Create a new commit with the updated commit message
    newCommit, _, err := client.Git.CreateCommit(ctx, repoOwner, commitOpts.Repo, commit)
    if err != nil {
        return err
    }
    // Attach the new commit to the reference
    ref.Object.SHA = newCommit.SHA

    // Update the branch reference to point to the new commit
    _, _, err = client.Git.UpdateRef(ctx, repoOwner, commitOpts.Repo, ref, false)
    if err != nil {
        return err
    }

    return nil
}

This fails with:

PATCH https://api.github.com/repos/MyOrg/myrepo/git/refs/heads/the-branch-I-am-creating-the-new-commit-to: 422 Update is not a fast forward []

Why isn't a fast-forward? It is simply a new commit created from an existing branch/commit.

PS: I EXPLICITLY DO NOT want to create new files on my commit.


Solution

  • func (s *GitService) CreateCommit(ctx context.Context, owner string, repo string, commit *Commit) (*Commit, *Response, error)
    

    The parameter commit is used to specify some of the information of the new commit, including the parents of the new commit (see the implementation).

    In your code, the new commit and the old commit has the same parents, so this is not a fast-forward push to the branch. To make it a fast-forward push to the branch, the parents of the new commit should point to the old commit.

    I guess the following change would make it a fast-forward:

    + commit.Parents = []*github.Commit{commit}
      newCommit, _, err := client.Git.CreateCommit(ctx, repoOwner, commitOpts.Repo, commit)