1

master使用 Rugged,我从(我们称之为)创建一个新分支new_branch,修改一个文件并为此创建一个提交。现在我想将此分支合并到master,将 master 推送到远程并删除new_branch

在运行下面的代码时,在任何一个分支上都没有修改过的文件,也没有暂存的文件,因为修改后的文件被提交到new_branch.

这是我使用的代码:

        from_branch = @repo.head.name
        their_commit = @repo.branches[into_branch].target_id
        our_commit = @repo.branches[from_branch].target_id

        index = @repo.merge_commits(our_commit, their_commit)

        if index.conflicts?
            # conflicts. deal with them
        else
            # no conflicts
            commit_tree = index.write_tree(@repo)
            @repo.checkout(into_branch)

            commit_author = { email: GIT_EMAIL, name: GIT_NAME, time: Time.now }
            Rugged::Commit.create(@repo,
                committer: commit_author,
                message: "Merge #{from_branch} into #{into_branch}",
                parents: [@repo.head.target, our_commit], 
                tree: commit_tree,
                update_ref: @repo.branches[into_branch].canonical_name)

            @repo.push('origin', [@repo.head.name], { credentials: @cred })
            @repo.branches.delete(from_branch)
        end

这按预期工作(修改后的文件被合并到master,它被推送到远程并且新分支被删除),但是一旦完成,我留下的修改后的文件显示master为已修改和暂存,准备好提交,而应该有'不是工作目录中的任何修改文件,也没有上演。一切都应该是最新的。

4

1 回答 1

2

在您的代码中,您正在更新任意分支,因此在一般情况下,索引和工作树不应受到关注。

如果您要合并到当前分支中,那么(并且在那时)您将缺少使用合并结果更新索引和工作树的步骤。您可以使用

@repo.checkout_tree(commit_tree)

签出文件,因为它们在结果提交中。这还将更新存储库的索引文件以包含该树的内容。然后,您可以更新当前分支以指向合并提交。

你有一个电话,@repo.checkout(into_branch)但既然你似乎已经 into_branch你的情况下,那充其量也无济于事。您需要检查合并的结果@repo.merge_commits(),调用未触及分支、索引或工作目录。

于 2015-07-11T18:04:19.803 回答