【问题标题】:Does git return specific return error codes?git 是否返回特定的返回错误代码?
【发布时间】:2019-10-01 05:20:19
【问题描述】:

例如合并错误或变基错误。它有唯一的错误代码吗?

【问题讨论】:

    标签: git


    【解决方案1】:

    我设置了一个失败的测试。这是我得到的:

    $ git merge newbranch
    Auto-merging test.txt
    CONFLICT (content): Merge conflict in test.txt
    Automatic merge failed; fix conflicts and then commit the result.
    
    $ echo $?
    1
    

    Git 按预期正确合并时返回0

    【讨论】:

    • 麻烦的是,git merge(在 1.7.4 - kernel.org/pub/software/scm/git/docs/v1.7.4/git-merge.html)的文档只在一个地方提到了返回状态(如果你使用“--ff-only”并且它可以' t 执行快进提交,它返回非零值 - 如果一切正常或存在合并冲突,它没有明确说明返回的内容。
    • @Matt:Git 命令非常非常好地返回零表示成功,否则返回非零(通常为 1)。您始终可以使用&& 安全地将命令链接在一起;他们的测试就是这样实现的。
    • Git 不适合返回一致且合理的退出代码。例如,不做任何更改的 git commit 会以代码 1 退出,但见鬼,这是 not 错误。
    • 来自 builtin/merge.c 源代码中的评论:“当有待解决的冲突时,后端以 1 退出,当它根本不处理给定的合并时以 2 退出。”
    • git rebase 的行为是否相同?
    【解决方案2】:

    简而言之,没有。您将看到退出代码 1 表示错误,0 表示成功。

    通过对源的快速查找,有一些预期的 127 和 128 用于其特定目的(未找到命令,已报告错误),并且在一些地方有一些不寻常的代码,但用于磨机错误,都是exit(1)

    【讨论】:

    • 这对于调试您的提交挂钩非常烦人。如果失败的提交总是返回 1 而不是你的钩子退出代码,那么在你的 git 钩子中甚至有一个退出代码有什么意义。
    • *nix 应用程序返回状态 0 表示完全成功。其他状态代码由应用程序确定。还有 255 个其他代码,其含义取决于应用程序。有关详细信息,请参阅他们的 man 页面。
    • @shawnhcorey 问题是 git 没有记录它的非零错误代码。
    • 有时您还会看到退出代码 1 表示成功。
    【解决方案3】:

    在非 git repo 上运行 git status 返回 128,而不是 1,这有助于快速确定 git repo 是否存在。

    【讨论】:

    • git rev-parse --is-inside-work-tree 更好
    【解决方案4】:

    git push --delete origin a_remote_tag_name

    如果使用 git 版本 1.8.3.1 的标签不存在,则返回 256

    如果有一个每个命令返回的特定返回码及其指示的综合列表,那就太好了。这也可能有助于防止更改返回代码的含义(自动化脚本可能依赖于该含义)。

    【讨论】:

      【解决方案5】:

      错误 128,没有来自 git 的错误消息,可能是“意外问题”的包罗万象。

      我在需要修改 .git 下的文件的操作(例如“git checkout -- myfile”以恢复修改的文件)中得到这个。 (在我的情况下,“chmod -R og+w .git”修复了它;当然,除非您了解对您的情况的安全影响,否则不要这样做!)

      【讨论】:

        【解决方案6】:

        Git 2.24(2019 年第四季度)确实说明了 git 命令如何返回代码。

        commit 50094cacommit c1a6f21commit 854b5cbcommit dd2b6b6commit 6bd26f5commit c6ec6dacommit f2e2fa8commit 460609ccommit 460609ccommit 92014b6、@9876543321、@、@9876543321 @(2019 年 8 月 27 日)和 commit fe49814(2019 年 8 月 20 日)Denton Liu (Denton-L)
        (由 Junio C Hamano -- gitster -- 合并于 commit 1c6fc94,2019 年 9 月 30 日)

        t4014: 停止丢失 git 命令的返回码

        目前Git命令的返回码有两种方式 丢失的。

        第一种方式是当命令位于管道的上游时。在一个 管道,只使用最后一个命令的返回码。因此,所有其他 命令的返回码将被屏蔽。
        重写管道,使上游没有 Git 命令。

        另一种方式是当命令位于非赋值子shell中时。
        返回代码将丢失,有利于周围的命令。
        重写此实例,以便 Git 命令输出到文件和 周围的命令只调用带有非 Git 命令的子shell。

        所以不要写:

        git cat-file commit rebuild-1 | grep "^Side .* with .* backslash-n"
        

        类型:

        git cat-file commit rebuild-1 >actual &&
            grep "^Side .* with .* backslash-n" actual
        

        【讨论】:

          猜你喜欢
          • 2016-09-30
          • 2011-12-04
          • 1970-01-01
          • 2020-09-06
          • 1970-01-01
          • 2017-03-24
          • 1970-01-01
          • 2014-07-03
          • 1970-01-01
          相关资源
          最近更新 更多