2011-04-12 15 views
23

¿Es posible ejecutar scripts de PowerShell como git hooks?Ejecución de scripts de PowerShell como git hooks

Estoy ejecutando git en un indicador de PowerShell, lo que no debería hacer ninguna diferencia, pero parece que no puedo hacer que funcionen, ya que los ganchos se nombran sin extensiones, y PowerShell necesita (AFAIK) el .ps1 extensión. No estoy seguro de si ese es el problema, o algo más.

Gracias, Erick

+0

¿No es posible hacer el guión invocar el script de PowerShell (o cualquier otro script para el caso, independientemente de su extensión)? – holygeek

+1

¿Puede darnos un poco más de información sobre los ganchos git? – JPBlanc

+0

@JPBlanc: [La página de manual de 'githooks '.] (Http://www.kernel.org/pub/software/scm/git/docs/githooks.html) No tengo idea si hay documentación diferente provista para Windows versión (s). – intuited

Respuesta

5

Por lo que sé la única opción debido al diseño de Git aquí sería una escritura del golpe llamando PowerShell. Desafortunado, pero una vez más, Git no pensó en la compatibilidad con Linux.

+0

Esta parece ser la respuesta. Es una pena, no todos somos amantes de la bash, y bash en las ventanas siempre será el segundo lugar. Gracias. –

+0

Si git admitía la creación de scripts para plataformas arbitrarias, ¿qué tan diferentes serían los archivos de configuración para esos ganchos de las secuencias de comandos bash bootstraps? – brianary

5

He estado buscando esto por mí mismo, y me encontré con lo siguiente:

Git Powershell gancho pre-commit (Source)

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

PHP Sintaxis cheque por git pre-commit en 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 

El código es para un enlace precompromiso, pero puede modificarlo para hacer casi cualquier cosa. ¡Debería ayudar con lo que necesita hacer!

+0

El primero no funciona para mí. La ruta relativa al script de powershell no se resuelve correctamente. –

15

Cambie el nombre de pre-commit.sample a precompromiso en la carpeta de ganchos. Luego, haga el archivo de script powershell pre-commit.ps1 en la misma carpeta.

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

Creo que la sintaxis en esta línea de comando es incorrecta después de -Command está esperando un comando en línea de powershell pero también está especificando un archivo. Lanzará un error acerca de que -File no se reconoce como el nombre de un cmdlet, función o archivo de script. – leinad13

+0

Consulte [mi respuesta a continuación] (http://stackoverflow.com/a/39796096/1225497) si obtiene errores como "#! No se reconoce ..." o "El término -File no se reconoce ..." . – Taran

2

Kim Ki Won 's respuesta anterior no funcionó para mí, pero tiene upvotes así que supongo que funciona para algunas personas.

Lo que funcionó para mí estaba dejando el bin/sh y en lugar de ejecutar utilizando -File, ejecutar el comando directamente:.

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

Esto funcionó para mí también, ¡gracias! – David

0

Ésta es mi gancho de Git en Windows encuentra en \ git \ ganchos.

posterior a la actualización

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

script de PowerShell encuentra en la carpeta raíz del proyecto (donde se ejecuta inicialmente git init). Powershell va a otro repositorio y llama a pull, actualizando ese repositorio.

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 
Cuestiones relacionadas