Ausführen von PowerShell-Skripten als Git-Hooks

Lesezeit: 7 Minuten

Benutzer-Avatar
Erik T

Ist es möglich, PowerShell-Skripte als Git-Hooks auszuführen?

Ich führe git in einer PowerShell-Eingabeaufforderung aus, was keinen Unterschied machen sollte, aber ich kann sie anscheinend nicht zum Laufen bringen, da die Hooks ohne Erweiterungen benannt sind und PowerShell (AFAIK) die Erweiterung .ps1 benötigt. Ich bin mir nicht sicher, ob es daran liegt oder an etwas anderem.

  • Ist es nicht möglich, das Skript dazu zu bringen, das Powershell-Skript (oder ein anderes Skript, unabhängig von seiner Erweiterung) aufzurufen?

    – Heiliggeist

    12. April 2011 um 1:32 Uhr

  • Können Sie etwas mehr Informationen zu Git-Hooks geben?

    – JPBlanc

    12. April 2011 um 4:45 Uhr

  • @JPBlanc: Das githooks manpage. Ich habe keine Ahnung, ob für die Windows-Version(en) eine andere Dokumentation bereitgestellt wird.

    – intuitiv

    12. April 2011 um 6:09 Uhr


  • Holygeek – Haben Sie ein Beispiel für das Abfeuern eines PowerShell-Skripts aus einem Bash-Skript? Ich kann keine Beispiele finden und bin mir nicht sicher, wie ich vorgehen soll.

    – Eric T

    13. April 2011 um 4:41 Uhr

  • Erick: Du solltest es per anrufen können powershell -file someScript.ps1 args

    – Joey

    4. Oktober 2011 um 10:39 Uhr

Benutzer-Avatar
Keith Hill

Seit Power Shell 7.2 Das Skript muss unter Windows die Erweiterung .ps1 haben. Diese Antwort wird also nicht funktionieren.


Sie können PowerShell-Skripts einbetten direkt in der Hook-Datei. Hier ist ein Beispiel für eine pre-commit Haken, den ich verwendet habe:

#!/usr/bin/env pwsh

# Verify user's Git config has appropriate email address
if ($env:GIT_AUTHOR_EMAIL -notmatch '@(non\.)?acme\.com$') {
    Write-Warning "Your Git email address '$env:GIT_AUTHOR_EMAIL' is not configured correctly."
    Write-Warning "It should end with '@acme.com' or '@non.acme.com'."
    Write-Warning "Use the command: 'git config --global user.email <[email protected]>' to set it correctly."
    exit 1
}

exit 0

Dieses Beispiel erfordert PowerShell Core, wird jedoch plattformübergreifend ausgeführt (vorausgesetzt, diese Datei war unter Linux/macOS chmod +x).

  • Ab Oktober 2018 sollte dies die akzeptierte Antwort sein. Danke Keith.

    – Keine Rückerstattung, keine Rückgabe

    27. Oktober 2018 um 6:12 Uhr

  • Gute Antwort! Dies #!/usr/bin/env pwsh “Trick” funktioniert auch für git rebase --exec und git bisect run. Das ist mir leider aufgefallen pwsh wird nicht mit einem Fehlercode beendet, wenn das Skript fehlschlägt. Stellen Sie daher sicher, dass Sie Ihr zu verwendendes Skript ändern exit Schlüsselwort, wenn etwas fehlschlägt.

    – Mariusz Pawelski

    4. Februar 2019 um 22:33 Uhr

  • Diese Lösung scheint bei mir nicht zu funktionieren – /usr/bin/env: 'pwsh': No such file or directoryund ich habe Powershell Core installiert

    – Bort

    19. Juni 2019 um 20:59 Uhr


  • Vielen Dank dafür! Wenn Sie Ihre Powershell aus Geschwindigkeitsgründen ohne Profil ausführen möchten (ich habe es auf jeden Fall getan), können Sie dies für die oberste Zeile tun: #!/usr/bin/env -S pwsh -NoProfile

    – CubanX

    14. Juni 2021 um 15:37 Uhr

  • Leider muss das Skript seit Powershell 7.2 unter Windows die Erweiterung .ps1 haben (github.com/PowerShell/PowerShell/releases/tag/v7.2.0-preview.9). Ein Wrapper-Skript wie einige Antworten unten werden benötigt.

    – Doraemö

    10. November 2021 um 22:19 Uhr

Benutzer-Avatar
Kim Ki Won

Benennen Sie pre-commit.sample in pre-commit im Hooks-Ordner um. Erstellen Sie dann die Powershell-Skriptdatei pre-commit.ps1 im selben Ordner.

#!/bin/sh
c:/Windows/System32/WindowsPowerShell/v1.0/powershell.exe -ExecutionPolicy RemoteSigned -File '.git\hooks\pre-commit.ps1'

  • Ich denke, die Syntax in dieser Befehlszeile ist falsch, nachdem -Command einen Inline-Powershell-Befehl erwartet, aber Sie geben auch eine Datei an. Es wird ein Fehler darüber ausgegeben, dass -File nicht als Name einer Cmdlet-, Funktions- oder Skriptdatei erkannt wird.

    – leinad13

    30. September 2016 um 11:33 Uhr

  • Sehen Sie sich meine Antwort unten an, wenn Sie Fehler wie “#! wird nicht erkannt …” oder “Der Begriff -Datei wird nicht erkannt …” erhalten.

    – Taran

    30. September 2016 um 16:32 Uhr


Soweit ich weiß, wäre die einzige Option aufgrund des Designs von Git hier ein Bash-Skript, das PowerShell aufruft. Schade, aber andererseits hat Git keinen Gedanken an die Nicht-Linux-Kompatibilität verschwendet.

  • Dies scheint die Antwort zu sein. Schade – wir sind nicht alle Bash-Liebhaber, und Bash on Windows wird immer an zweiter Stelle stehen. Vielen Dank.

    – Eric T

    13. April 2011 um 4:42 Uhr

  • Wenn git Scripting für beliebige Plattformen unterstützt, wie unterschiedlich würden die Konfigurationsdateien für diese Hooks wirklich von den Bash-Script-Bootstraps aussehen?

    – Dornbusch

    9. April 2013 um 16:20 Uhr

  • Ab Oktober 2018 können Sie Powershell Core direkt im Pre-Commit-Hook verwenden, wie von Keith Hill beschrieben. Das leben ist gut. Bitte erwägen Sie, die akzeptierte Antwort zu ändern.

    – Keine Rückerstattung, keine Rückgabe

    27. Oktober 2018 um 6:14 Uhr

  • Wenn Sie nach einer anderen, möglicherweise besseren Antwort suchen, mit der Sie Powershell Core direkt verwenden können, lesen Sie meine Antwort auf diese Frage. Die Welt hat sich verändert, seit diese Frage gestellt/beantwortet wurde und jetzt ist es fast so weit too einfach, dies zu tun.

    – Keine Rückerstattung, keine Rückgabe

    20. Mai 2019 um 15:09 Uhr

Kim Ki WonDie Antwort von oben hat bei mir nicht funktioniert, aber sie hat Upvotes, also gehe ich davon aus, dass sie für einige Leute funktioniert.

Was für mich funktioniert hat, war das Löschen von bin/sh und anstatt mit -File auszuführen, den Befehl direkt auszuführen:

c:/Windows/System32/WindowsPowerShell/v1.0/powershell.exe -ExecutionPolicy RemoteSigned -Command .\.git\hooks\pre-commit.ps1

Benutzer-Avatar
Keine Rückerstattungen Keine Rücksendungen

Hier ist ein Start-PWSH-Skript, das ich für mein verwendet habe PowerShell Git Hooks seit ich die Antwort von Keith Hill gelesen habe. Sehr schön.

#!/usr/bin/env pwsh

Process {
    Write-Information -MessageData "I Ran" -InformationAction Continue
}
Begin {
    Write-Information -MessageData "Beginning" -InformationAction Continue
}
End {
    Write-Information -MessageData "Ending" -InformationAction Continue

    Exit 0
}

Ich sollte auch erwähnen, dass ich eine einzige Kopie von Hooks über alle meine Repos teile. Meine Repos leben alle in R:\Git und ich habe R:\Git\Hooks erstellt und verwendet https://git-scm.com/docs/githooks zu git config core.hooksPath=R:\Git\Hooks global. Das leben ist gut.

Benutzer-Avatar
Simon Tewsi

Der Vollständigkeit halber:

Wenn Sie nur Windows PowerShell und nicht PowerShell Core installiert haben, funktioniert die nette Antwort von Keith Hill nicht. Die verschiedenen Antworten, die ein Bash-Skript zum Ausführen von PowerShell verwenden und den Pfad zum auszuführenden PowerShell-Skript übergeben, sind unkompliziert und der Weg, den ich am Ende gewählt habe. Ich habe jedoch entdeckt, dass es einen anderen Weg gibt:

Erstellen Sie zwei Dateien für den Git-Hook, sagen wir pre-commit und pre-commit.ps1. Die Datei pre-commit.ps1 ist die Datei, die PowerShell ausführt. Die andere Pre-Commit-Datei (ohne Dateierweiterung) ist leer, abgesehen von einer PowerShell-Interpreter-Anweisung in der ersten Zeile:

#!/usr/bin/env powershell

Git führt die Pre-Commit-Datei aus, analysiert die PowerShell-Interpreter-Direktive und führt PowerShell aus, wobei der Pfad zur Pre-Commit-Datei übergeben wird. PowerShell geht davon aus, dass die übergebene Datei die Erweiterung „.ps1“ haben sollte. Es sucht nach pre-commit.ps1 und da Sie eine Datei mit diesem Namen und dieser Erweiterung erstellt haben, findet PowerShell sie und führt sie aus.

Dieser Ansatz ist nett und einfach, aber am Ende habe ich mich dagegen entschieden, weil er ein wenig “magisch” erschien und Betreuer sich darüber den Kopf zerbrechen könnte, wie er funktioniert.

Benutzer-Avatar
JasonMArcher

Ich habe selbst danach gesucht und folgendes gefunden:

Git Powershell Pre-Commit-Hook (Quelle)

## Editor's note: Link is dead as of 2014-5-2.  If you have a copy, please add it.

PHP-Syntaxprüfung für Git Pre-Commit in PowerShell (Sauer)

##############################################################################
#
# PHP Syntax Check for Git pre-commit hook for Windows PowerShell
#
# Author: Vojtech Kusy <[email protected]>
#
###############################################################################

### INSTRUCTIONS ###

# Place the code to file "pre-commit" (no extension) and add it to the one of 
# the following locations:
# 1) Repository hooks folder - C:\Path\To\Repository\.git\hooks
# 2) User profile template   - C:\Users\<USER>\.git\templates\hooks 
# 3) Global shared templates - C:\Program Files (x86)\Git\share\git-core\templates\hooks
# 
# The hooks from user profile or from shared templates are copied from there
# each time you create or clone new repository.

### SETTINGS ###

# Path to the php.exe
$php_exe = "C:\Program Files (x86)\Zend\ZendServer\bin\php.exe";
# Extensions of the PHP files 
$php_ext = "php|engine|theme|install|inc|module|test"
# Flag, if set to 1 git will unstage all files with errors, se to 0 to disable
$unstage_on_error = 0;

### FUNCTIONS ###

function php_syntax_check {
    param([string]$php_bin, [string]$extensions, [int]$reset) 

    $err_counter = 0;

    write-host "Pre-commit PHP syntax check:" -foregroundcolor "white"

    git diff-index --name-only --cached HEAD -- | foreach {             
        if ($_ -match ".*\.($extensions)$") {
            $file = $matches[0];
            $errors = & $php_bin -l $file           
            if ($errors -match "No syntax errors detected in $file") {
                write-host $file ": OK" -foregroundcolor "green"
            }
            else {              
                write-host $file ":" $errors -foregroundcolor "red"
                if ($reset) {
                    git reset -q HEAD $file
                    write-host "Unstaging" $file "..." -foregroundcolor "magenta"
                }
                $err_counter++
            }
        }
    }

    if ($err_counter -gt 0) {
       exit 1
    }    
}

### MAIN ###

php_syntax_check $php_exe $php_ext $unstage_on_error

Der Code ist für einen Pre-Commit-Hook, aber Sie können ihn so ändern, dass er so ziemlich alles macht. Sollte helfen, was Sie tun müssen!

  • Ersteres funktioniert bei mir nicht. Der relative Pfad zum Powershell-Skript wird nicht korrekt aufgelöst.

    – Klas Melbourn

    27. Mai 2013 um 19:30 Uhr

1283280cookie-checkAusführen von PowerShell-Skripten als Git-Hooks

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

Privacy policy