是否可以将PowerShell脚本作为git hooks运行?
我在PowerShell提示符下运行git,这应该没什么区别,但我似乎无法让它们工作,因为钩子的命名没有扩展名,而PowerShell需要(AFAIK).ps1扩展名。我不确定这是问题还是其他问题。
谢谢, 埃里克
答案 0 :(得分:20)
将pre-commit.sample重命名为hooks文件夹中的pre-commit。 然后在同一文件夹中制作pre-commit.ps1 powershell脚本文件。
#!/bin/sh
c:/Windows/System32/WindowsPowerShell/v1.0/powershell.exe -ExecutionPolicy RemoteSigned -Command -File '.git\hooks\pre-commit.ps1'
答案 1 :(得分:12)
您可以将 PowerShell脚本直接嵌入到挂钩文件中。这是我使用的Registration results = entityManager.createQuery( query )
.setParameter("username", "abcd")
.getSingleResult()
钩子的示例:
pre-commit
此示例需要PowerShell Core,但结果是它将跨平台运行(假设此文件在Linux / macOS上为chmod + x)。
答案 2 :(得分:6)
从我收集的内容来看,由于Git的设计,唯一的选择是调用PowerShell的bash脚本。不幸的是,但是Git并没有考虑非兼容性。
答案 3 :(得分:5)
我一直在寻找这个,我发现了以下内容:
Git Powershell pre-commit hook (Source)
## Editor's note: Link is dead as of 2014-5-2. If you have a copy, please add it.
PHP语法检查PowerShell中的git pre-commit (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
代码用于预提交挂钩,但您可以修改它以执行任何操作。应该帮助你做什么!
答案 4 :(得分:5)
0x80070005
上面的回答对我没有用,但它有支持,所以我认为它适用于某些人。
对我来说有用的是删除bin / sh而不是使用-File执行,直接执行命令:
Kim Ki Won
答案 5 :(得分:1)
这是自阅读Keith Hill的答案以来一直用于PowerShell Git Hooks
的PWSH脚本。很好。
#!/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
。生活是美好的。
答案 6 :(得分:0)
这是Windows上的git hook,位于。\ git \ hooks。
发表更新强>
#!/bin/sh
c:/Windows/System32/WindowsPowerShell/v1.0/powershell.exe -ExecutionPolicy Bypass -Command '.\post-update.ps1'
位于项目根文件夹(最初运行git init的位置)的Powershell脚本。 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
答案 7 :(得分:0)
出于完整性考虑:
如果仅安装Windows PowerShell而没有安装PowerShell Core,则Keith Hill的简洁答案不起作用。使用bash脚本运行PowerShell的各种答案,直接传递到要运行的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会找到并运行它。
这种方法既简单又好用,但最终我还是决定反对它,因为它似乎有些“神奇”,并且可能会让维护人员为它的工作原理scratch之以鼻。
答案 8 :(得分:0)
我没有得到Simon的答案,可能是由于Windows git环境和/或使用bonobo git服务器无法正确解析路径中的其他内容。
我的目标是为bo黑猩猩托管的存储库编写一个预接收钩子。
我最终得到了以下shebang:
#!/c/Windows/System32/WindowsPowerShell/v1.0/powershell
否则工作原理相同:
就我个人而言,为了保持整洁,我还使用了
mklink <path-to-repo>\hooks\pre-receive.ps1 c:\scripts\hooks\someLibraryScript.ps1
这当然使我可以将脚本保存在中央存储库中。