首页 > 解决方案 > gitpython 合并 -X 他们的

问题描述

我想通过选择master,使用gitpython将master合并到本地分支中,同时丢弃任何冲突的东西。

我在做

    repo = self._repo
    # have all history locally
    repo.git.fetch('--all')
    # set build branch as remote and discard local changes
    repo.git.reset('--hard', '{origin}/{branch}'
                   .format(origin=self.origin_name, branch=self.build_branch_name))

    # set active branch as build branch
    repo.git.checkout(self._config.git_branch)

    # merge master into build
    current = repo.active_branch
    master = repo.branches[self.master_name]
    base = repo.merge_base(current, master)
    repo.index.merge_tree(master, base, "-X theirs")
    repo.index.commit('Merge master into feature', parent_commits=(current.commit, master.commit))

这失败repo.index.merge_tree(master, base, "-X theirs")TypeError: merge_tree() takes at most 3 arguments (4 given)

这样做的正确方法是什么?

标签: pythongitgitpython

解决方案


(我试图弄清楚同样的事情,所以这些基本上是我在调查时的笔记......)

merge_tree不接受任何额外的参数,除了base

    def merge_tree(self, rhs, base=None):

该文档说用于index.from_tree控制合并分辨率:

引发:
GitCommandError – 如果存在合并冲突。错误将在第一个冲突路径引发。如果您想自己完成适当的合并解决方案,则必须提交更改的索引(或从中创建有效的树)并使用三向 IndexFile.from_tree 调用重试。

from_tree通过接受额外的参数**kwargs并将它们传递给它的git read-tree命令:

    def from_tree(cls, repo, *treeish, **kwargs):

...

            repo.git.read_tree(*arg_list, **kwargs)

但是,read-tree没有合并策略选项;相反,它只有--trivial--aggressive(默认from_tree使用--aggressive):

git read-tree [[-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>]
        [-u [--exclude-per-directory=<gitignore>] | -i]]
        [--index-output=<file>] [--no-sparse-checkout]
        (--empty | <tree-ish1> [<tree-ish2> [<tree-ish3>]])

from_tree返回一个新索引而不是操纵全局索引,所以我最好的猜测是:

    new_index = IndexFile.from_tree(repo, base, current, master, m=True)
    new_index.commit('Merge master into feature', parent_commits=(current.commit, master.commit))

在这一点上,我不确定您如何将该新提交与您的分支相关联。gitpython 团队建议还是使用repo.git.merge

但是,我的建议始终是git直接将命令用于此类常见功能(例如repo.git.merge(...)),除非您确实必须实现自己的专用逻辑,从而在IndexFile.

所以也许这不是:

    repo.git.merge(master, X='theirs')

推荐阅读