2011-04-12 4 views
23

Est-il possible d'exécuter des scripts PowerShell en tant que crochets git? Je lance git dans une invite PowerShell, ce qui ne devrait pas faire de différence, mais je n'arrive pas à les faire fonctionner, car les hooks sont nommés sans extensions, et PowerShell a besoin (AFAIK) du .ps1 extension. Je ne suis pas sûr si c'est le problème ou quelque chose d'autre.Exécution de scripts PowerShell en tant que crochets git

Merci, Erick

+0

est-il pas possible de faire le script appeler le script PowerShell (ou tout autre script pour cette question, quelle que soit leur extension)? – holygeek

+1

Pouvez-vous donner un peu plus d'informations sur les crochets git. – JPBlanc

+0

@JPBlanc: [La page de manuel 'githooks'.] (Http://www.kernel.org/pub/software/scm/git/docs/githooks.html) Je ne sais pas s'il existe une documentation différente pour Windows version (s). – intuited

Répondre

5

D'après ce que je comprends la seule option en raison de la conception de Git serait ici un script bash appelant PowerShell. Malheureusement, mais encore une fois, Git n'a pas pensé à la compatibilité non-Linux.

+0

Cela semble être la réponse. Est-ce dommage - nous ne sommes pas tous des amateurs de bash, et bash sur windows sera toujours la deuxième place. Merci. –

+0

Si git supportait les scripts pour des plates-formes arbitraires, à quel point les fichiers de configuration de ces hooks seraient-ils vraiment différents des bootstraps de bash script? – brianary

5

Je cherchais moi-même, et je l'ai trouvé ce qui suit:

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. 

Vérification de la syntaxe PHP pour git pre-commit dans 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 

Le code est pour un hook pré-commit, mais vous pouvez le modifier pour faire à peu près n'importe quoi. Devrait aider ce que vous devez faire! Renommez pre-commit.sample en pré-validation dans le dossier hooks.

+0

Le premier ne fonctionne pas pour moi. Le chemin d'accès relatif au script powershell ne se résout pas correctement. –

15

Ensuite, faites le fichier de script powershell pre-commit.ps1 dans le même dossier.

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

Je pense que la syntaxe dans cette ligne de commande est erronée après -Command elle attend une commande inline powershell mais vous spécifiez également un fichier. Il va lancer une erreur sur -File n'étant pas reconnu comme le nom d'une cmdlet, d'une fonction ou d'un fichier de script. – leinad13

+0

Voir [ma réponse ci-dessous] (http://stackoverflow.com/a/39796096/1225497) si vous obtenez des erreurs comme "#! N'est pas reconnu ..." ou "Le terme -Fichier n'est pas reconnu ..." . – Taran

2

réponse de Kim Ki Won travail fait ci-dessus pas pour moi, mais il a upvotes donc je suppose que cela fonctionne pour certaines personnes.

Ce qui a fonctionné pour moi tombais bin/sh et au lieu d'exécuter en utilisant -File, l'exécution de la commande directement.

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

Cela a fonctionné pour moi aussi, merci! – David

0

Ceci est mon crochet git sous Windows situé dans \ crochets git de \.

post-mise à jour

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

de script Powershell situé dans le dossier racine du projet (où vous exécutez initialement git init). Powershell va à un autre dépôt et appelle les appels, mettant à jour ce dépôt.

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 
Questions connexes