Запуск сценариев PowerShell в качестве хитов Git - PullRequest
30 голосов
/ 12 апреля 2011

Можно ли запускать сценарии PowerShell как перехватчики git?

Я запускаю git в приглашении PowerShell, что не должно иметь никакого значения, но я не могу заставить их работать, посколькуперехватчики именуются без расширений, а PowerShell требует (AFAIK) расширение .ps1.Я не уверен, что это проблема или что-то еще.

Спасибо, Эрик

Ответы [ 8 ]

20 голосов
/ 24 апреля 2014

Переименуйте pre-commit.sample в pre-commit в папке hooks.Затем создайте файл сценария powershell pre-commit.ps1 в той же папке.

#!/bin/sh
c:/Windows/System32/WindowsPowerShell/v1.0/powershell.exe -ExecutionPolicy RemoteSigned -Command -File '.git\hooks\pre-commit.ps1'
13 голосов
/ 08 июля 2018

Вы можете встроить скрипт PowerShell напрямую в файл ловушек.Вот пример хука pre-commit, который я использовал:

#!/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 <name@acme.com>' to set it correctly."
    exit 1
}

exit 0

В этом примере требуется PowerShell Core, но в результате он будет работать кроссплатформенно (при условии, что этот файл был chmod + x в Linux/macOS).

5 голосов
/ 30 сентября 2016
Ответ

Kim Ki Won выше не сработал для меня, но у него есть положительные отзывы, поэтому я предполагаю, что он работает для некоторых людей.

Что мне помогло, так это сбросить bin / sh и вместо выполнения команды -File выполнить команду напрямую:

c:/Windows/System32/WindowsPowerShell/v1.0/powershell.exe -ExecutionPolicy RemoteSigned -Command .\.git\hooks\pre-commit.ps1
5 голосов
/ 12 апреля 2011

Из того, что я понял, единственная опция из-за дизайна Git - это скрипт bash, называющий PowerShell.К сожалению, с другой стороны, Git не задумывался о совместимости не с Linux.

4 голосов
/ 04 октября 2011

Я сам искал это и нашел следующее:

Git Powershell pre-commit hook ( Источник )

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

Проверка синтаксиса PHP для предварительной фиксации git в PowerShell ( Soure )

##############################################################################
#
# PHP Syntax Check for Git pre-commit hook for Windows PowerShell
#
# Author: Vojtech Kusy <wojtha@gmail.com>
#
###############################################################################

### 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

Код для хука перед фиксацией, но вы можете изменить его, чтобы сделать что угодно. Должно помочь то, что вам нужно сделать!

2 голосов
/ 27 октября 2018

Вот стартовый скрипт PWSH, который я использовал для моего PowerShell Git Hooks с момента чтения ответа Кейта Хилла.Очень хорошо.

#!/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
}

Я должен также упомянуть, что у меня есть одна копия хуков во всех моих репозиториях.Все мои репозитории живут в R: \ Git, и я создал R: \ Git \ Hooks и использовал https://git -scm.com / docs / githooks до git config core.hooksPath=R:\Git\Hooks по всему миру.Жизнь хороша.

0 голосов
/ 18 мая 2019

Для полноты:

Если у вас установлена ​​только Windows PowerShell, а не PowerShell Core, точный ответ Кейта Хилла не сработает.Различные ответы, в которых для запуска PowerShell используется сценарий bash, в котором указывается путь к сценарию PowerShell для выполнения, просты, и в конце я выбрал путь.Однако я обнаружил, что есть и другой способ:

Создать два файла для ловушки git, скажем pre-commit и pre-commit.ps1.Файл pre-commit.ps1 - это файл, который будет запускаться PowerShell.Другой файл предварительной фиксации (без расширения файла) является пустым, за исключением директивы интерпретатора PowerShell в первой строке:

#!/usr/bin/env powershell

Git запустит файл предварительной фиксации, проанализирует директиву интерпретатора PowerShell и выполнитPowerShell, передавая путь к файлу предварительной фиксации.PowerShell предполагает, что передаваемый файл должен иметь расширение «.ps1».Он будет искать файл pre-commit.ps1 и, поскольку вы создали файл с таким именем и расширением, PowerShell найдет его и запустит.

Этот подход приятен и прост, но, в конце концов, я решилпротив этого, потому что это казалось немного «волшебным» и, возможно, сопровождающие ломали голову о том, как это работает.

0 голосов
/ 09 февраля 2018

Это мой git hook в Windows, расположенный в. \ Git \ hooks.

post-update

#!/bin/sh
c:/Windows/System32/WindowsPowerShell/v1.0/powershell.exe -ExecutionPolicy Bypass -Command '.\post-update.ps1'

Скрипт Powershell, расположенный в корневой папке проекта(где вы изначально запускаете git init).Powershell переходит в другой репозиторий и вызывает pull, обновляя этот репозиторий.

post-update.ps1

Set-Location "E:\Websites\my_site_test"
$env:GIT_DIR = 'E:\Websites\my_site_test\.git';
$env:GIT_EXEC_PATH= 'C:\Program Files (x86)\Git/libexec/git-core';
git pull
...