在 Powershell 脚本中检查 git 状态是否干净

Check if git status is clean inside a Powershell script

我正在开发用于创建程序发布的 Powershell 脚本。 为此,我想检查 git 工作树是否干净并且没有未提交的更改。

我读过 this post 但它与 bash 有关。

如果 git 工作树是干净的并且有任何要提交的内容,我如何从 powershell 脚本内部检查?我不关心未跟踪的文件。

我试过

  $gitOutput = (git status -z) | Out-String
  if ($gitOutput) {
    "output"
  } else {
    "no Output"
  }

问题是当一切都已提交但有一些未跟踪的文件时,我也会打印 output,这是我想避免的事情。我想忽略未跟踪的文件并仅检查所有跟踪的文件是否已提交。

使用 git status --porcelain 将输出作为易于解析的列表。

未跟踪的文件以状态 ?? 为前缀,因此您可以轻松过滤掉这些文件,然后根据是否还有任何输出来检查是否有未提交的更改:

if(git status --porcelain |Where {$_ -match '^\?\?'}){
    # untracked files exist
} 
elseif(git status --porcelain |Where {$_ -notmatch '^\?\?'}) {
    # uncommitted changes
}
else {
    # tree is clean
}

我使用 git status --porcelain 找到了另一种解决方案。

$ChangedFiles = $(git status --porcelain | Measure-Object | Select-Object -expand Count)
if ($ChangedFiles -gt 0)
{
    Write-Output "Found $ChangedFiles changed files"
}

git status --porcelain returns git 状态 stable, easy-to-parse format.

在我自己的测试中,如果没有对跟踪文件和未跟踪文件进行任何修改,则在没有附加标志的情况下,它 returns 特别是一个空字符串。要忽略未跟踪的文件,可以添加标志 --untracked-files=no。下面的简单 powershell 语句利用它来生成布尔值 $hasEditsToTrackedFiles$hasEditsToTrackedFilesOrHasUntrackedFiles.

使用 --untracked-files=no 标志似乎比进行正则表达式匹配更简单、更容易理解。可能在这里可以用 --short 代替 --porcelain,但我还没有测试过。

$hasEditsToTrackedFiles                    = !([string]::IsNullOrEmpty($(git status --porcelain --untracked-files=no)))
$hasEditsToTrackedFilesOrHasUntrackedFiles = !([string]::IsNullOrEmpty($(git status --porcelain)))