PowerShell捕获Git输出



问题

我正在通过PowerShell运行一些git命令,但在捕获输出时遇到问题。

在我尝试使用Out-File之前,我研究过的许多方法都无法捕获任何输出。不幸的是,尽管这对我来说效果很好,但我发现git push命令出现了问题,使我无法捕获输出。。。

我的代码如下:

git add . | Out-File $logFilePath -Append
git status . | Out-File $logFilePath -Append
git commit -m "Some Relevant update message" | Out-File $logFilePath -Append
git push origin $branchname | Out-File $logFilePath -Append

当我查看日志文件时,它显示了除git push的输出之外的所有内容。因此,在对此进行故障排除时,我从行中删除了| Out-File,并注意到即使是输出窗口也不再显示git push的输出。只有当我从所有git命令中完全删除Out-File时,我才能再次按预期显示输出。不幸的是,这让我回到了原点。

问题

有人知道如何使用PowerShell最好地捕获git命令的输出,或者可以指出我做错了什么吗?

正如我在这里或这里解释的那样,Git命令输出是在stderr上完成的,而不是在stdout上。

因此,在您的情况下,您需要通过管道发送stderr
例如,请参阅"重定向附加到同一日志文件的标准和错误输出"。

注意:使用Git 2.16(2018年第一季度),您可以尝试设置第一个

set GIT_REDIRECT_STDERR=2>&1

然后应该将stderr重定向到stdout。

在"PowerShell-捕获Git命令的STDERR输出"中,OP Brandon指出了(例如)Git-push:的--porcelain选项

& git status --porcelain >> $logFilePath
& git push --porcelain >> $logFilePath

它允许将输出转换为机器可读的格式,并通过管道将其传输到输出。

如果你想写"正常的";返回git输出的PowerShell代码,可以使用调用该命令的函数重写该命令。这是因为在PowerShell中,命令按以下顺序解析:

  • 别名
  • 功能
  • Cmdlet
  • ExternalScript
  • 应用程序(git.exe是什么)

因此,您可以编写一个非常琐碎的函数来覆盖git(应用程序)。

function git() {
# Call git with splatting
& (Get-Command git -commandType Application) @args 2>&1
}

这种类型的函数有时被称为"函数";v1";或";简单的";函数(因为具有[CmdletBinding()][Parameter()]的函数是最初称为"高级函数"的v2加法)

这些函数没有标准的PowerShell参数,如-ErrorAction,但它们将无缝地向下调用git并返回结果列表。

然后你可以做:

$gitOutput = git status

当然,您仍然需要解析结果。

如果你想跳过解析git输出的痛苦,我编写了一个PowerShell模块,它使用了这个技巧,并允许将任何git命令可扩展地转换为对象。

它被称为ugit。

例如,使用ugit,你可以说:

# get all untracked files
git status | Select-Object -ExpandProperty Untracked
# get all branches that are not the current branch or named 'main' or 'master'
git branch |
Where-Object -Not IsCurrentBranch |
Where-Object -Name -NotIn main, master

最新更新