Ответ 1
Из того, что я собираю, единственным вариантом из-за дизайна Git здесь был бы вызов bash script, вызывающий PowerShell. Несчастливо, но опять же, Git не думал о совместимости с Linux.
Можно ли запускать сценарии PowerShell в качестве git hooks?
Я запускаю git в приглашении PowerShell, который не должен иметь никакого значения, но я не могу заставить их работать, так как крючки называются без расширений, а PowerShell (AFAIK). расширение ps1. Я не уверен, что это проблема, или что-то еще.
Спасибо, Erick
Из того, что я собираю, единственным вариантом из-за дизайна Git здесь был бы вызов bash script, вызывающий PowerShell. Несчастливо, но опять же, Git не думал о совместимости с Linux.
Переименуйте 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'
Вы можете встроить скрипт 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).
Я искал это сам, и я нашел следующее:
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
Код предназначен для привязки до фиксации, но вы можете изменить его, чтобы сделать что угодно. Помогите, что вам нужно сделать!
Kim Ki Won
ответ выше не работал у меня, но у него есть upvotes, поэтому я предполагаю, что это работает для некоторых людей.
Что сработало для меня, это сбросить bin/sh и вместо выполнения использования -File выполнить команду напрямую:
c:/Windows/System32/WindowsPowerShell/v1.0/powershell.exe -ExecutionPolicy RemoteSigned -Command .\.git\hooks\pre-commit.ps1
Вот стартовый 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
всему миру. Жизнь хороша.
Это мой 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
Для полноты картины:
Если у вас установлена только 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" с указанным именем в указанном каталоге. Поскольку вы создали его, он найдет его и запустит.
Этот подход хорош и прост, но, в конце концов, я отказался от него, потому что он казался немного "волшебным" и, возможно, сопровождающие ломали голову над тем, как он работает.