web-dev-qa-db-ja.com

PowerShellスクリプトをgitフックとして実行する

PowerShellスクリプトをgitフックとして実行することは可能ですか?

PowerShellプロンプトでgitを実行していますが、何の違いもありませんが、フックには拡張子なしで名前が付けられており、PowerShellには.ps1拡張子が必要(AFAIK)であるため、機能させることができないようです。それが問題なのか、それとも他の問題なのかわかりません。

ありがとう、エリック

32
Erick T

ここでGitの設計による唯一のオプションを収集したのは、PowerShellを呼び出すbashスクリプトです。残念ながら、GitはLinux以外の互換性については何も考えていませんでした。

5
Joey

Pre-commit.sampleの名前をhooksフォルダーでpre-commitに変更します。次に、pre-commit.ps1PowerShellスクリプトファイルを同じフォルダーに作成します。

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

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 <[email protected]>' to set it correctly."
    exit 1
}

exit 0

この例ではPowerShellCoreが必要ですが、その結果、クロスプラットフォームで実行されます(このファイルがLinux/macOSでchmod + xであると想定)。

15
Keith Hill

Kim Ki Wonの上記の答えは私にはうまくいきませんでしたが、賛成票があるので、一部の人にはうまくいくと思います。

私にとってうまくいったのは、bin/shを削除し、-Fileを使用して実行する代わりに、コマンドを直接実行することでした。

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

私はこれを自分で探していましたが、次のことがわかりました。

Git Powershell pre-commitフックソース

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

PowerShellでのgit pre-commitのPHP構文チェック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

コードはpre-commitフック用ですが、ほとんど何でもできるように変更できます。あなたがする必要があることを助けるべきです!

4
TiernanO

これは、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
}

また、すべてのリポジトリでフックのコピーを1つ共有していることにも言及する必要があります。私のリポジトリはすべてR:\ Gitにあり、R:\ Git\Hooksを作成し、 https://git-scm.com/docs/githooks to git config core.hooksPath=R:\Git\Hooksグローバルに使用しました。人生は素晴らしい。

これは、。\ git\hooksにあるWindows上の私のgitフックです。

更新後

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

プロジェクトのルートフォルダー(最初にgit initを実行する場所)にあるPowershellスクリプト。 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
1
Tudor Morar

完全を期すために:

Windows PowerShellのみがインストールされており、PowerShell Coreがインストールされていない場合、KeithHillの適切な回答は機能しません。 bashスクリプトを使用してPowerShellを実行し、実行するPowerShellスクリプトへのパスを渡すさまざまな答えは簡単で、最終的に私が選択した方法です。しかし、私は別の方法があることを発見しました:

Gitフック用にpre-commitとpre-commit.ps1の2つのファイルを作成します。 pre-commit.ps1ファイルは、PowerShellが実行するファイルです。もう1つの事前コミットファイル(ファイル拡張子なし)は、最初の行のPowerShellインタープリターディレクティブを除いて空です。

#!/usr/bin/env powershell

Gitはpre-commitファイルを実行し、PowerShellインタープリターディレクティブを解析してPowerShellを実行し、pre-commitファイルへのパスを渡します。 PowerShellは、渡されるファイルの拡張子が「.ps1」であると想定します。 pre-commit.ps1を検索し、その名前と拡張子でファイルを作成したので、PowerShellはそれを見つけて実行します。

このアプローチは素晴らしくシンプルですが、最終的には、少し「魔法」のように見え、メンテナがどのように機能するかについて頭を悩ませている可能性があるため、反対しました。

0
Simon Tewsi