【问题标题】:How to stop git from writing non-errors to stderr如何阻止 git 将非错误写入 stderr
【发布时间】:2019-11-22 18:20:09
【问题描述】:

我有一个用于自动同步各种远程 git 存储库的脚本。我试图用我的脚本做的一件事是从每个命令中捕获 stderr 的输出,并将所有这些错误写入一个文本文件,然后在脚本完成后通过电子邮件发送给我。这会提醒我需要解决的任何问题。

但是,我遇到以下两行的问题:

{
    git fetch --prune-tags github-fetch master
    git push github master 
} 2> '/tmp/stderr-contents-sync_git_repositories.txt'

问题在于git fetch 行正在将以下内容写入标准错误:

From https://github.com/XJDHDR/xjdhdr-random-code.wiki
 * branch            master     -> FETCH_HEAD
   13af304..333d602  master     -> github/master

git pull 行是这样写的:

To ssh://github.com/XJDHDR/xjdhdr-random-code.wiki.git
   333d602..da65970  master -> master

我的问题是这些都不是错误,每次我运行脚本时都会通过电子邮件发送。我想知道是否可以阻止 git 将这些非错误写入 stderr 或从 stderr 输出中过滤掉这些类型的消息,同时保留真正的错误。

【问题讨论】:

  • 也许您正在寻找-q/--quiet 选项?我不确定它是否隐藏了这样的输出。
  • --quiet 选项确实隐藏了我提到的输出。我担心该选项是否还会隐藏发生的任何错误?还是仍然发送错误?
  • @XJDHDR 查看我的回答:Git 不仅将 stderr 用于错误,还用于信息性消息。我建议的方法应该允许您捕获失败的命令执行(使用他们的 stdout/stderr),而不是单独依赖 stderr。
  • 获取和推送的文档说@wjandrea 提到的-q 选项确实关闭了所有输出,除了每个输出的实际错误——特别是,它关闭了到stderr 的进度报告。

标签: bash git stderr


【解决方案1】:

将所有这些错误写入文本文件

那些总是错误的,考虑到大多数 Git 命令在 stderr 上输出信息消息,如 I mentioned here:

stderr 因为它只是信息性消息,不被机器消费。

如果最好测试命令的退出状态并通过电子邮件发送stdout and stderr 如果所述退出状态不同于 0

另外,您正在执行两个重定向:> 后跟 >:第二个将重新创建 /tmp/stderr-contents-sync_git_repositories.txt:第二个重定向应该是>>,而不是>

所以:

git fetch --prune-tags github-fetch master > tmp 2>&1 || cat tmp > '/tmp/stderr-contents-sync_git_repositories.txt'
git push github master > tmp 2>&1 || cat tmp >> '/tmp/stderr-contents-sync_git_repositories.txt'

在这里,我在每个命令上覆盖 tmp 文件(使用它们的 stdout/stderr),如果该命令失败,我会写入或附加到 /tmp/stderr-contents-sync_git_repositories.txt

这比你的编辑更容易,你将两个命令重定向到一个文件,即使其中一个可能失败。

这就是我做cmd1 || cat >> file 的原因:>> 部分仅在cmd1 失败时运行。

【讨论】:

  • 我的编辑是为了更准确地反映我的实际脚本的样子。实际的脚本在这些大括号内有大约 35 行代码,我需要捕获所有这些的 stderr 输出。简单地将它们全部包含在大括号中并进行一个重定向,而不是为每个命令添加一个重定向。这也是 ShellCheck 推荐的:stackoverflow.com/a/30194723/6627890
  • @XJDHDR 不那么乏味,但不太精确:您需要测试每个命令的退出状态,正如我解释的答案:stderr 不是此处问题的可靠指标。
  • 当我到达那座桥时,我会越过它。否则,谢谢你的回答。
  • 只需注意对每个 git 命令执行此操作(如答案中所示),而不是在问题中显示的花括号末尾。如果大括号中的一个命令失败,大括号的输出仍然可以成功。
猜你喜欢
  • 2011-12-03
  • 2016-04-21
  • 1970-01-01
  • 2021-07-05
  • 2016-11-03
  • 1970-01-01
  • 2020-12-12
  • 1970-01-01
  • 2019-12-11
相关资源
最近更新 更多