在 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)))
我正在开发用于创建程序发布的 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)))