git是否返回特定的返回错误代码?

poy*_*ode 76 git

像合并错误或rebase错误.它有唯一的错误代码吗?

Cas*_*bel 52

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

从快速点击源代码,有一些预期的127和128用于它们的特定目的(命令未找到,错误已经报告),以及一些地方的一些不寻常的代码,但是对于磨机错误的运行,它是所有exit(1).

  • 是的,我也见过127和128.无论如何,谢谢. (3认同)
  • 这对于调试提交挂钩非常烦人.如果失败的提交只是总是返回1而不是你的钩子退出代码,那么即使你的git钩子中有退出代码也是如此. (3认同)
  • @shawnhcorey问题是git没有记录其非零错误代码。 (3认同)

chr*_*ock 47

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

$ 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
Run Code Online (Sandbox Code Playgroud)

0正如预期的那样,Git 在正确合并时返回.

  • Git不适合返回一致且合理的退出代码.例如,执行没有更改的git提交将退出代码1,但是,它是*不*错误. (17认同)
  • @Matt:Git命令非常非常非常适合返回零成功和非零(通常为1)否则.您总是可以使用`&&`安全地将命令链接在一起; 这就是他们的测试实施方式. (8认同)
  • 麻烦的是,用于git merge的文档(在1.7.4-http://www.kernel.org/pub/software/scm/git/docs/v1.7.4/git-merge.html)仅提及返回状态放在一个位置(如果您使用“ --ff-only”并且它无法进行快速提交,则它返回非零值-它不会明确说明返回值是否全部正常或是否存在)合并冲突。 (2认同)
  • 来自builtin/merge.c的源代码中的注释:"当解决冲突时,后端退出1,当它根本不处理给定的合并时,退出2." (2认同)

Gus*_*rtz 12

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

  • `git rev-parse --is-inside-work-tree` 更好 (3认同)

小智 7

git push --delete origin a_remote_tag_name

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

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


Dar*_*ook 5

错误128(没有来自git的错误消息)可能是“意外问题”的全部。

我正在git checkout -- myfile通过其他用户修改.git下文件的操作(例如“ ”以还原修改后的文件)进行操作。(在我的案例中,“ chmod -R og+w .git”已解决;很自然,除非您了解案例的安全隐患,否则不要这样做!)


Von*_*onC 5

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

请参阅提交 50094ca提交 c1a6f21提交 854b5cb提交 dd2b6b6提交 6bd26f5提交 c6ec6da提交 f2e2fa8 、提交 460609c 、提交 92014b6提交 0ab74e9提交 cb46c40 提交b562a54(8 月 27 日) 2019),并提交 fe49814(2019 年 8 月 20 日)作者:刘丹顿 ( )(由Junio C Hamano 合并 -- --提交 1c6fc94中,2019 年 9 月 30 日)Denton-L
gitster

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

目前,Git 命令的返回码丢失有两种情况。

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

另一种方法是当命令位于非赋值子 shell中时。
返回码将丢失,取而代之的是周围命令的返回码。
重写此实例,以便 Git 命令输出到文件,并且周围的命令仅调用具有非 Git 命令的子 shell。

所以不要写:

git cat-file commit rebuild-1 | grep "^Side .* with .* backslash-n"
Run Code Online (Sandbox Code Playgroud)

类型:

git cat-file commit rebuild-1 >actual &&
    grep "^Side .* with .* backslash-n" actual
Run Code Online (Sandbox Code Playgroud)