2011-04-12 169 views
23

是否有可能以git掛鉤運行PowerShell腳本?運行PowerShell腳本作爲git掛鉤

我在PowerShell提示符下運行git,這應該沒有什麼區別,但我似乎無法讓它們工作,因爲鉤子命名時沒有擴展名,PowerShell需要(AFAIK).ps1延期。我不確定這是否是問題或其他問題。

感謝, 埃裏克

+0

是不是有可能使腳本調用PowerShell腳本(或任何其他腳本對於這個問題,無論其擴展名)? – holygeek 2011-04-12 01:32:59

+1

你可以提供一些關於git鉤子的更多信息。 – JPBlanc 2011-04-12 04:45:03

+0

@JPBlanc:[The'githooks' manpage。](http://www.kernel.org/pub/software/scm/git/docs/githooks.html)我不知道是否爲Windows提供了不同的文檔(諸)版本。 – intuited 2011-04-12 06:09:41

回答

5

從我所收集的唯一選擇,由於Git的設計在這裏將是一個bash腳本調用的PowerShell。不幸的是,Git沒有考慮非Linux的兼容性。

+0

這似乎是答案。這是否可惜 - 我們並不都是bash愛好者,而windows上的bash始終是第二位。謝謝。 – 2011-04-13 04:42:53

+0

如果git支持任意平臺的腳本,那麼這些鉤子的配置文件在bash腳本引導程序中看起來有多不同? – brianary 2013-04-09 16:20:14

5

我一直在尋找這個我自己,我發現:

Git的Powershell的pre-commit鉤子Source

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

PHP語法檢查git的預先承諾的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 

代碼是用於預先提交的鉤子,但您可以修改它以執行任何操作。應該幫助你需要做的事情!

+0

第一個不適合我。 PowerShell腳本的相對路徑無法正確解析。 – 2013-05-27 19:30:37

15

將pre-commit.sample重命名爲預先提交到hooks文件夾中。 然後在相同的文件夾中創建pre-commit.ps1 powershell腳本文件。

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

我覺得這個命令行中的語法在-Command之後是錯誤的,它期望一個內聯的powershell命令,但是你也指定了一個文件。它會拋出一個關於-File未被識別爲cmdlet,函數或腳本文件的錯誤的錯誤。 – leinad13 2016-09-30 11:33:16

+0

請參閱[我的答案](http://stackoverflow.com/a/39796096/1225497)如果您遇到類似「#!無法識別...」或「文件無法識別...」的錯誤, 。 – Taran 2016-09-30 16:32:57

2

Kim Ki Won的回答上面並沒有爲我工作,但它具有upvotes,所以我會假設它爲一些人。

什麼工作對我來說是下降的bin/sh和,而不是使用 - 文件執行,直接執行命令:

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

這也適用於我,謝謝! – David 2016-10-11 20:46:52

0

這是在Windows的git我的鉤位於\ git的\掛鉤。

更新後的

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