无法让git停止输出到StdErr

时间:2016-10-28 20:13:17

标签: git tfs

我正在开发一些可在TFS上运行的构建脚本。在构建过程中,我需要检查构建过程中完成的更改(其他项目所依赖的一组二进制文件)。

我真的想为脚本启用“标准错误失败”选项,但是即使我告诉它不要,我的推送仍然会写入标准错误。

我所做的是:

git push -q binaryRepo HEAD:"$Env:BUILD_SOURCEBRANCH"

但是我在构建

后的日志中得到以下内容
2016-10-28T20:05:32.3179442Z ##[error]remote: 
remote: Analyzing objects... (3/3) (657 ms)        
remote: Storing packfile... done (40 ms)        
remote: Storing index... done (42 ms)        

2016-10-28T20:05:32.3209423Z Done
2016-10-28T20:05:32.4019436Z ##[error]Process completed with exit code 0 and had 1 error(s) written to the error stream.
2016-10-28T20:05:32.4029436Z ##[debug]System.Exception: Process completed with exit code 0 and had 1 error(s) written to the error stream.

当我加入-q开关时,为什么我仍然会输出标准错误?

如果重要git version举报2.10.0.windows.1

1 个答案:

答案 0 :(得分:2)

任何带有remote:前缀的内容都不是由你的 Git吐出来的,而是由其他 Git吐出来的,你正在推送的那个

没有内置的方法来关闭其他Git。你可以找出他们 1 设置了什么样的预接收和更新钩子 - 这些钩子,或者他们调用的东西,是打印Analyzing objects等等 - 然后看看如果他们提供了一个安静的"标志,如果是这样,他们是否为你提供了某种方式设置那个标志。 2 如果没有,你就被困住了:你必须完全丢弃stderr输出,或忽略它(相同的东西)。您可以相信,如果您的 Git打印出一些重要的失败消息,它将以非零状态退出:您可以控制的东西(必要时修改您自己的Git,或切换到另一个虽然"在遥控器上完成的事情"通常是你无法控制的东西。

1 听起来像#34;他们"实际上是你,这意味着你很幸运!只需站在另一方,服务器端,您正在执行这些脚本,并查看脚注2。

2 由于缺少暴露的侧通道,因此没有简单方便但通用的方法来设置标志。如果您使用ssh://作为协议,则可以使用$HOME/.ssh/environment传递额外的环境变量,前提是他们的 sshd允许此 。这有点笨拙,如果你使用https://,显然根本不起作用。

另一种在理论上有用的方法 - 我从来没有在实践中尝试过 - 是有一个商定的,总是强制推送的虚拟分支或标签名称。这不能与update挂钩一起使用,但是pre-receive挂钩可以通过所有建议的更新进行扫描,如果包含特殊分支或标记,则使用其存在和/或其目标对象来提供走私数据(例如,剩余预接收分支行动的标志)。