Überprüfen Sie, ob der Git-Status in einem Powershell-Skript sauber ist

Lesezeit: 2 Minuten

Benutzer-Avatar
Jepessen

Ich entwickle ein Powershell-Skript zum Erstellen einer Programmversion. Um dies zu tun, möchte ich überprüfen, ob der Git-Arbeitsbaum sauber ist und keine nicht festgeschriebenen Änderungen vorhanden sind.

Ich habe diesen Beitrag gelesen, aber er bezieht sich auf Bash.

Wie kann ich in einem Powershell-Skript überprüfen, ob der Git-Arbeitsbaum sauber ist und etwas zu übergeben ist? Untracked Dateien sind mir egal.

Ich habe so etwas versucht

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

Das Problem ist, dass ich drucke output Auch wenn alles festgeschrieben ist, aber einige nicht verfolgte Dateien vorhanden sind, möchte ich das vermeiden. Ich möchte nicht nachverfolgte Dateien ignorieren und nur prüfen, ob alle nachverfolgten Dateien festgeschrieben sind.

Benutzer-Avatar
Mathias R. Jessen

Verwenden git status --porcelain um die Ausgabe als Liste zu erhalten, die einfach zu analysieren ist.

Unverfolgten Dateien wird der Status vorangestellt ??sodass Sie diese einfach herausfiltern und dann prüfen können, ob nicht festgeschriebene Änderungen vorhanden sind, je nachdem, ob noch Ausgaben übrig sind:

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

  • Dadurch werden alle Zeilen herausgefiltert, die nicht Anfang ?? Das heißt, es wird sauber gemeldet, wenn nachverfolgte Änderungen ausstehen, und nur nicht sauber melden, wenn nicht nachverfolgte Änderungen vorhanden sind – was nicht erforderlich war. Die Regex sollte {$_-match ‘^ sein[^\?\?]’} dies wird herausgefiltert ?? stattdessen.

    – TheLogicMan

    26. Oktober 2018 um 7:53 Uhr


  • @TheLogicMan Danke, du hast Recht, die Antwort wurde aktualisiert

    – Mathias R. Jessen

    26. Oktober 2018 um 10:27 Uhr

  • Ich persönlich tue es einfach if (-not (git status --porcelain)) { echo "clean!" }oder umgekehrt, if (git status --porcelain) { throw "not clean!" }. Es funktioniert, weil jeder Wert wahr ist (Änderungen erkannt) und kein Wert falsch ist (keine Änderungen erkannt).

    – Christian Rondeau

    4. April 2019 um 2:57 Uhr

Ich habe eine andere Lösung mit gefunden git status --porcelain.

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

Benutzer-Avatar
orion elenzil

git status --porcelain gibt den Git-Status in einer zurück stabiles, einfach zu analysierendes Format.

In meinen eigenen Tests gibt es ohne zusätzliche Flags speziell eine leere Zeichenfolge zurück, wenn keine Änderungen an nachverfolgten Dateien und auch keine nicht nachverfolgten Dateien vorgenommen wurden. Um nicht getrackte Dateien zu ignorieren, das Flag --untracked-files=no dürfen hinzugefügt werden. Die folgenden einfachen Powershell-Anweisungen nutzen dies, um boolesche Werte zu erhalten $hasEditsToTrackedFiles und $hasEditsToTrackedFilesOrHasUntrackedFiles.

Verwendung der --untracked-files=no flag scheint etwas einfacher und verständlicher zu sein als ein Regex-Match. Möglicherweise --short könnte hier anstelle von verwendet werden --porcelainhabe ich aber nicht getestet.

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

1028420cookie-checkÜberprüfen Sie, ob der Git-Status in einem Powershell-Skript sauber ist

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy