将PowerShell脚本作为git钩子运行

时间:2011-04-12 01:02:55

标签: git powershell githooks

是否可以将PowerShell脚本作为git hooks运行?

我在PowerShell提示符下运行git,这应该没什么区别,但我似乎无法让它们工作,因为钩子的命名没有扩展名,而PowerShell需要(AFAIK).ps1扩展名。我不确定这是问题还是其他问题。

谢谢, 埃里克

9 个答案:

答案 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/githooksgit 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

否则工作原理相同:

  • 仅使用shebang创建预接收文件
  • 在hooks目录中创建pre-receive.ps1。 Powershell会改为加载它。

就我个人而言,为了保持整洁,我还使用了

mklink <path-to-repo>\hooks\pre-receive.ps1 c:\scripts\hooks\someLibraryScript.ps1

这当然使我可以将脚本保存在中央存储库中。