Подтвердить что ты не робот

Запуск сценариев PowerShell в качестве git hooks

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

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

Спасибо, Erick

4b9b3361

Ответ 1

Из того, что я собираю, единственным вариантом из-за дизайна Git здесь был бы вызов bash script, вызывающий PowerShell. Несчастливо, но опять же, Git не думал о совместимости с Linux.

Ответ 2

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

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

Ответ 3

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

#!/usr/bin/env pwsh

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

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

Ответ 4

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

Git Ключ предварительной фиксации Powershell (Источник)

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

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

Ответ 5

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

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

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

Ответ 6

Вот стартовый 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 всему миру. Жизнь хороша.

Ответ 7

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

после обновления

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

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

после 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

Ответ 8

Для полноты картины:

Если у вас установлена только 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" с указанным именем в указанном каталоге. Поскольку вы создали его, он найдет его и запустит.

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