source

PowerShell 스크립트를 깃 후크로 실행

lovecheck 2023. 8. 5. 10:40
반응형

PowerShell 스크립트를 깃 후크로 실행

PowerShell 스크립트를 깃 훅으로 실행할 수 있습니까?

나는 PowerShell 프롬프트에서 git을 실행하고 있는데, 이것은 아무런 차이가 없을 것 같지만, 후크의 이름이 확장자 없이 지정되어 있고 PowerShell(AFAIK)에는 .ps1 확장자가 필요하기 때문에 작동할 수 없는 것 같습니다.저는 그것이 문제인지 아니면 다른 것인지 확신할 수 없습니다.

powershell 7.2 이후 Windows에서는 스크립트 확장자가 .ps1이어야 합니다.그래서 이 대답은 통하지 않을 것입니다.


후크 파일 내부에 직접 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 <name@acme.com>' to set it correctly."
    exit 1
}

exit 0

이 예에서는 PowerShell Core가 필요하지만 결과적으로 교차 플랫폼을 실행합니다(이 파일이 Linux/macOS에서 chmod +x였다고 가정).

후크 폴더에서 pre-commit.sample의 이름을 pre-commit in hooks로 변경합니다.그런 다음 precommit.ps1 powershell 스크립트 파일을 동일한 폴더에 만듭니다.

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

Kim Ki Won위의 답변은 저에게 효과가 없었지만, 찬성표가 있기 때문에 어떤 사람들에게는 효과가 있다고 생각합니다.

-File을 사용하여 실행하는 대신 bin/sh를 삭제하고 직접 명령을 실행했습니다.

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의 설계로 인해 여기서 유일한 옵션은 PowerShell이라는 bash 스크립트일 것입니다.불행하게도 Git는 Linux 이외의 호환성에 대해 전혀 생각하지 않았습니다.

완전성을 위해:

Windows PowerShell만 있고 PowerShell Core는 설치되지 않은 경우 Keith Hill의 깔끔한 답변이 작동하지 않습니다.bash 스크립트를 사용하여 PowerShell을 실행하고 실행할 PowerShell 스크립트의 경로를 전달하는 다양한 답변은 간단하며 결국 제가 선택한 방식입니다.하지만, 저는 다른 방법이 있다는 것을 발견했습니다.

githook에 대한 두 개의 파일(예: pre-commit 및 pre-commit.ps1)을 만듭니다.precommit.ps1 파일은 PowerShell이 실행할 파일입니다.첫 번째 줄에 있는 PowerShell 인터프리터 지시문을 제외하고 다른 사전 커밋 파일(파일 확장자 없음)은 비어 있습니다.

#!/usr/bin/env powershell

Git는 사전 커밋 파일을 실행하고, PowerShell 인터프리터 지침을 구문 분석하고, PowerShell을 실행하여 사전 커밋 파일의 경로를 전달합니다.PowerShell은 전달된 파일의 확장자가 ".ps1"이어야 한다고 가정합니다.precommit.ps1을 검색하고 해당 이름과 확장자로 파일을 생성했으므로 PowerShell에서 파일을 찾아서 실행합니다.

이 접근 방식은 멋지고 단순하지만, 결국에는 약간 "마법적"인 것 같았고 유지 관리자들이 어떻게 작동하는지에 대해 머리를 긁적이게 할 수도 있기 때문에 반대하기로 결정했습니다.

제가 직접 찾아보니 다음과 같습니다.

Git Powershell 사전 커밋 후크(소스)

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

PowerShell(Soure)에서 Git 사전 커밋에 대한 PHP 구문 검사

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

코드는 사전 커밋 후크에 대한 것이지만 거의 모든 작업을 수행하도록 수정할 수 있습니다.당신이 해야 할 일을 도와야 합니다!

.\git\hooks에 있는 Windows의 Git 후크입니다.

업데이트 후의

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

프로젝트 루트 폴더(처음에 git를 실행한 위치)에 있는 Powershell 스크립트.Powershell이 다른 리포지토리로 이동하고 pull을 호출하여 해당 리포지토리를 업데이트합니다.

postupdate.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 git 환경 및/또는 bonogit 서버를 사용하는 과정에서 다른 사항들이 제대로 구문 분석되지 않았기 때문에 Simon의 답변을 듣지 못했습니다.

제 목표는 보노보에 있는 저장소를 위한 사전 수신 후크를 작성하는 것이었습니다.

저는 결국 다음과 같은 셰뱅을 하게 되었습니다.

#!/c/Windows/System32/WindowsPowerShell/v1.0/powershell

그렇지 않으면 다음과 같이 작동합니다.

  • shebang만 있는 사전 수신 파일 만들기
  • 후크 디렉토리에 prererereceive.ps1을 만듭니다.대신 Powershell이 이를 로드합니다.

저 같은 경우에는 청결을 위해서 사용하기도 했습니다.

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

이를 통해 스크립트를 중앙 저장소에 보관할 수 있습니다.

편집: Powershell이 사전 수신 후크에 대한 stdin 스트림을 받아들이도록 하지 않았다는 것에 주목할 필요가 있습니다.결과적으로 나는 여전히 셸 스크립트를 사용하여 powershell로 리디렉션하는 대신 powershell과 파이프를 부트스트랩하고 있습니다.

이 경우 사전 수신 후크에 다음 셸 스크립트를 사용했습니다.

#!/bin/sh
IFS=
echo `cat -` | powershell.exe -NoProfile -ExecutionPolicy Bypass -File "c:\scripts\hooks\pre-receive.ps1"

파워셸은 그것에 만족하는 것 같습니다.

새로운 시대의 pwsh를 위한 더 나은 솔루션

위의 답변 중 많은 것이 오래된 것이며, 이제 더 간단하고 더 나은 옵션이 있습니다.

PowerShell PowerShell을 할 수 .#! /usr/bin/env powershell확장자가 없는 파일을 허용하지 않았기 때문입니다.

문제의 확장자가 "" "" "" "" "" ""인 스크립트 이었습니다..ps1다른 사람의 대답에 언급된 것입니다.그러나 이는 문서화되지 않은 내부 구현의 가능성을 활용하며 예상치 못한 문제가 발생할 수 있습니다.

그러나 pwsh 시대에는 크로스 플랫폼 호환성을 위해 확장자 없이 스크립트 파일을 실행하는 것이 지원되었습니다.에서도 윈우즈플도다추음됩하다니면만가를 추가하기만 .#! /usr/bin/env pwsh다른 추가 작업 없이 이 파일에 직접 스크립트를 작성할 수 있습니다.

언급URL : https://stackoverflow.com/questions/5629261/running-powershell-scripts-as-git-hooks

반응형