2013-03-29 124 views
34

我最近開始了project on github。 我設法使用Travis每次提交後都設置自動測試。但是現在我想用jshint設置一個預先提交的鉤子。所以如果jshint報告錯誤,提交應該失敗。但是這是可能的,如果是這樣,怎麼做?設置預掛鉤jshint

回答

38

但是,這是可能的...

是的!這個有可能。我recently wrote about it。請注意,它不是特定於GitHub,通常只是Git - 因爲它是預先提交的鉤子,它在之前運行任何數據發送到GitHub。

存儲庫中/.git/hooks目錄中的任何適當命名的可執行文件將作爲掛鉤運行。默認情況下,可能會有一堆示例掛鉤。 Here's a simple shell script我作爲一個JSLint的pre-commit鉤子使用(你可以修改它很容易與JSHint工作代替):

#!/bin/sh 

files=$(git diff --cached --name-only --diff-filter=ACM | grep "\.js$") 
if [ "$files" = "" ]; then 
    exit 0 
fi 

pass=true 

echo "\nValidating JavaScript:\n" 

for file in ${files}; do 
    result=$(jslint ${file} | grep "${file} is OK") 
    if [ "$result" != "" ]; then 
     echo "\t\033[32mJSLint Passed: ${file}\033[0m" 
    else 
     echo "\t\033[31mJSLint Failed: ${file}\033[0m" 
     pass=false 
    fi 
done 

echo "\nJavaScript validation complete\n" 

if ! $pass; then 
    echo "\033[41mCOMMIT FAILED:\033[0m Your commit contains files that should pass JSLint but do not. Please fix the JSLint errors and try again.\n" 
    exit 1 
else 
    echo "\033[42mCOMMIT SUCCEEDED\033[0m\n" 
fi 

你可以簡單地說,在名爲使用Git 預提交一個可執行文件掛鉤目錄,它會在每次提交之前運行。

+0

日Thnx了很多!但是,我一定在做錯事,因爲我無法讓它工作。我已經創建了.git/hooks文件,並使其可執行。現在當我提交一個「錯誤太多」的文件時,它只是提交它。另外,當我手動運行鉤子時,我被困在/ bin/sh中。現在,當我輸入「exit」時,我收到「COMMIT FAILED」消息。有什麼建議麼 ? –

+0

只是另一件事。如果我刪除了/ bin/sh,鉤子就會從命令行運行。但是我仍然可以提交:( –

+0

@JeanlucaScaljeri - 你是否修改過JSHint?在當前狀態下,它尋找的字符串是特定於JSLint的。 –

15

一些變化@詹姆斯阿勒代斯腳本來滿足JSHint。感謝您的原始代碼。

#!/bin/sh 
# 
# Run JSHint validation before commit. 

files=$(git diff --cached --name-only --diff-filter=ACMR -- *.js **/*.js) 
pass=true 


if [ "$files" != "" ]; then 
    for file in ${files}; do 
     result=$(jshint ${file}) 

     if [ "$result" != "" ]; then 
      echo "$result" 
      echo "\n" 
      pass=false 
     fi 
    done 
fi 


if $pass; then 
    exit 0 
else 
    echo "" 
    echo "COMMIT FAILED:" 
    echo "Some JavaScript files are invalid. Please fix errors and try committing again." 
    exit 1 
fi 
37

有做預提交您的Node.js的工作流程檢查(如JSHint)的更簡單的方法

從NPM安裝jshint

npm install jshint

接下來在您的項目中創建一個.jshintrc文件,如果您還沒有。 如:https://github.com/nelsonic/learn-jshint/blob/master/.jshintrc

現在安裝pre-commit模塊(並將其保存爲一個開發依賴):

npm install pre-commit --save-dev

接下來您需要定義將用於JSHint在運行的任務(腳本)的的package.json

如:

{ "scripts": { "jshint": "jshint -c .jshintrc --exclude-path .gitignore ." } }

那麼你註冊,你就需要運行腳本預提交(也的package.json),例如:

"pre-commit": [ "jshint", "coverage", "etc" ]

這可以讓你擁有的不僅僅是一張支票更在預提交流程。 (我們有檢查,以確保團隊成員的代碼與JSHint,代碼樣式符合性和測試覆蓋率爲100%)

對於您可以與您的團隊分享更詳細的教程,請參閱:https://github.com/nelsonic/learn-pre-commit

+0

嗨。你知道如何設置文件夾我wana掃描嗎? – AlexeiBerkov

+0

@AlexeiBerkov你問你是哪個文件夾想要'jshint'進行掃描?參見:http://jshint.com/docs/cli/ – nelsonic

+0

@nelsonic預提交鉤子只能與jshint的一組規則一起使用嗎?我可以使用另一個linter嗎? – RicardoGonzales

2

類似的腳本來@伊戈爾的一個與一些改進:

  • 顏色指標
  • 沒有--diff過濾器,grep的使用INSEAD
  • 幫助消息(GIT風格),以避免預先提交調用

#!/bin/sh 
# 
# Run JSHint validation before commit. 

RED='\033[0;31m' 
REDBOLD='\033[1;31m' 
ORANGE='\033[0;33m' 
NC='\033[0m' # No Color 

files=$(git diff --cached --name-only | grep .js) 
pass=true 
totalErrors=0 

if [ "$files" != "" ]; then 
    for file in ${files}; do 
     result=$(jshint ${file}) 
     if [ "$result" != "" ]; then 
      echo "${RED}$result${NC}" 
      pass=false 
      totalErrors=$((totalErrors+1)) 
     fi 
     echo "" 
    done 
fi 

if $pass; then 
    exit 0 
else 
    echo "${ORANGE}===== ${totalErrors} JSHint Error${NC}" 
    echo "" 
    echo "${REDBOLD}COMMIT FAILED: Some JavaScript files are invalid. Please fix errors and try committing again.${NC}" 
    echo "" 
    echo " (use -n option \"git commit -n -m <message>\" to avoid call pre-commit hook and JSHint check)" 
    echo "" 
    exit 1 
fi 
+0

看起來不錯! :)這只是* nix而已。 – igor