我已经在Python中实现了自动合并脚本。如果存在一些合并冲突,它应该自动合并分支并创建拉取请求。
我的部分脚本如下:
from subprocess import check_call, CalledProcessError
# E.g. destination_branch = "master", source_branch = "release"
try:
check_call(['git', 'checkout', '%s' % destination_branch])
check_call(['git', 'merge', '--no-ff', '%s' % source_branch])
except CalledProcessError:
# Creating pull request.
看起来一切都很好,但这里有一些问题。
经过一些自动合并后,我遇到了以下错误:
error: you need to resolve your current index first
Dockerfile: needs merge
。我也打印这两步的状态码。状态代码为1,这不好。
因此,我可以看到太多拉取请求,其中大部分都没有任何合并冲突。
这里有什么问题?
更新
在合并之前我还有一些用于分支更新的东西(以保持最新版本)。 它看起来像:
try:
check_call(['git', 'checkout', str(source_branch)])
# branch successfully checked out
check_call(['git', 'pull', 'origin', str(source_branch)])
except CalledProcessError:
# Logging an errors.
要添加一件重要的事情:
正如小伙子们:@torek,@ MarkAdelsberger在评论中提到的那样,我也尝试过他们的解决方案,因为某些原因合并失败后添加了git merge --abort
命令。
所以,它没有任何帮助。它失败并出现另一个错误:
check_call([GIT_CMD, 'merge', '--abort'])
File "/usr/lib/python2.7/subprocess.py", line 540, in check_call
raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['git', 'merge', '--abort']' returned non-zero exit status 128
所以,我正在寻找一些解决方案......
想法?
答案 0 :(得分:3)
you need to resolve your current index first
形式的错误消息意味着您之前已经开始定期(非快进)合并,但它因合并冲突而失败。
当git merge
因合并冲突而失败时,Git会生成状态1退出。如果特定的失败合并作为此代码的一部分发生,check_call
代码将引发CalledProcessError
,但我们所知道的是,之前存在这样一个失败的合并,而不是它发生在这里:
subprocess.CalledProcessError: Command '...' returned non-zero exit status 1
一旦发生这种情况 - 无论是作为Python代码的一部分,还是通过其他方式 - 存储库的工作树和索引都留在了这个"合并失败,需要手部处理"州。如果您事先不知道存储库的状态,则应在开始之前找到它,例如,使用git status --porcelain
或git status --porcelain=v2
(请参阅the documentation for git status
;注意此Web版本不显示新的v2格式,这是在Git 2.11中首次发布的。
如果 将工作树和索引放入此部分合并,中间,需要处理状态并希望将其恢复到合并前状态,只需运行{{1 }}。不要尝试来自这个半大的 1 状态的提交或拉取请求:合并必须完成或完全中止。
除此之外:git merge --abort
很愚蠢,如果已知它是一个字符串,只需使用'%s' % expr
或str(expr)
本身。
1 Say" half-vast"大声,三次,快。 : - )