git am some_patch是否以原子方式应用?

问题描述 投票:0回答:1

我编写了一个自动代码,通过git python库应用git补丁。但是我想知道是否有可能应用某些补丁而有些补丁会出错。

    try:
        repo.git.execute(["git", "am", "patch")
    except Exception as e:
        for stat in status:
            stat.update({"status": "failure"})
        repo.git.execute(["git", "am", "--abort"])
        return status
python git gitpython git-am
1个回答
1
投票

你将不得不在这里更精确地定义“原子”的含义。特别是,但是:

[我]想知道的是[是否]某些补丁被应用的可能性和一些错误

git am path肯定有可能失败,而git am文档描述了那种情况下会发生什么。如果邮箱格式的补丁包含七个部分,并且前三个部分应用得很干净,但第四部分有合并冲突或其他失败,则前三个确实会应用,第四个确实尚未应用。如果失败的原因是由于合并冲突,则索引和工作树将处于部分合并状态。如果补丁根本不应用,则索引和工作树将匹配应用第三次提交所产生的状态。无论哪种方式,git am将退出非零。 (此时,您可以使用git am --abort将所有内容恢复到开始之前的状态,不应用任何补丁,或手动修复问题,然后运行git am --continue以恢复该过程。)

gitpython documentation提到如果底层的Git命令退出非零,则会引发git.exc.GitCommandError。因此,你会在这里遇到例外。

旁注:except Exception在Python中通常过于宽泛。您通常应该捕获您期望的特定异常,在这种情况下可能是git.exc.GitCommandError(对于git am存在并运行,但报告失败)和git.exc.GitError(对于一般情况出错,例如未安装Git二进制文件)或者Git声称这根本不是一个存储库,等等。

© www.soinside.com 2019 - 2024. All rights reserved.