检查Powershell脚本中的git状态是否清除

时间:2017-07-17 13:41:32

标签: git powershell git-status

我正在开发一个用于创建程序版本的Powershell脚本。 为了做到这一点,我想检查git工作树是否干净,并且没有未提交的更改。

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

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

我尝试过像

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

问题是我在提交所有内容时也打印output但是有一些未跟踪的文件,这是我想要避免的。我想忽略未跟踪的文件,只检查是否所有跟踪的文件都已提交。

3 个答案:

答案 0 :(得分:8)

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

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

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

答案 1 :(得分:2)

git status --porcelainstable, easy-to-parse format中返回git status。

在我自己的测试中,如果没有对跟踪文件进行任何修改,也没有未跟踪的文件,则在没有其他标志的情况下,它会专门返回一个空字符串。要忽略未跟踪的文件,可以添加标志--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)))

答案 2 :(得分:0)

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

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