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
4

2 回答 2

1

您将不得不在这里更准确地定义原子”的含义。但特别是:

[什么]我想知道的是[是否]有可能应用了一些补丁,而一些补丁会出错

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

gitpython 文档提到,git.exc.GitCommandError如果底层 Git 命令退出非零,则会引发此问题。因此,您将在此处捕获异常。

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

于 2019-02-13T16:30:29.920 回答
0

确保将 Git 2.34 用于您的原子进程,包括git am --abort

当 " git am --abort" ( man )未能正确中止时,它仍然以退出状态 0 退出,这已在 Git 2.34 (Q4 2021) 中更正。

请参阅Elijah Newren ( ) 的提交 c5ead19提交 42b5e09提交 ea7dc01(2021 年 9 月 10 日(由Junio C Hamano 合并——提交 6c84b00中,2021 年 9 月 23 日)newren
gitster

am: 修复错误退出状态 am 失败中止

签字人:以利亚·纽伦

所以在你的python函数中:

        repo.git.execute(["git", "am", "--abort"])
        return status

这将在 Git 2.34 之前返回“始终为真”,即使在中止失败时也是如此。

于 2021-10-10T10:22:17.030 回答