2013-03-29 32 views
34

Gần đây tôi đã bắt đầu một project on github. Tôi đã quản lý thiết lập thử nghiệm tự động sau mỗi lần commit bằng Travis. Nhưng bây giờ tôi muốn thiết lập một móc trước cam kết với jshint quá. Vì vậy, nếu jshint báo cáo lỗi, cam kết sẽ thất bại. Nhưng điều này có khả thi không, và nếu có, làm thế nào để làm điều này?thiết lập trước cam kết móc jshint

Trả lời

38

Nhưng điều này có thể ...

Có! Điều này là khả thi. I recently wrote about it. Lưu ý rằng nó không cụ thể cho GitHub, chỉ Git nói chung - vì nó là một móc trước khi commit, nó chạy trước mọi dữ liệu được gửi đến GitHub.

Bất kỳ tệp thực thi nào được đặt tên phù hợp trong thư mục /.git/hooks của kho lưu trữ của bạn sẽ được chạy dưới dạng móc. Có thể sẽ có một loạt các móc mẫu trong đó đã được mặc định. Here's a simple shell script mà tôi sử dụng như một JSLint pre-cam kết nối (bạn có thể sửa đổi nó rất dễ dàng để làm việc với JSHint thay):

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

Bạn chỉ có thể đặt rằng trong một tập tin thực thi có tên pre-cam trong Git của bạn móc thư mục, và nó sẽ chạy trước mỗi lần commit.

+0

thnx rất nhiều !! Tuy nhiên, tôi phải làm điều gì đó sai, bởi vì tôi không thể làm cho nó hoạt động được. Tôi đã tạo tập tin bên trong .git/hooks và làm cho nó thực thi được. Bây giờ khi tôi cam kết một tập tin với "quá nhiều lỗi" nó chỉ đơn giản là cam kết nó. Ngoài ra, khi tôi chạy móc theo cách thủ công, tôi bị kẹt trong/bin/sh. Bây giờ khi tôi gõ "exit" tôi nhận được thông báo "COMMIT FAILED". Bất kỳ đề xuất ? –

+0

chỉ là một điều khác. Nếu tôi loại bỏ/bin/sh, hook hoạt động từ dòng lệnh. Nhưng tôi vẫn có thể cam kết: ( –

+0

@JeanlucaScaljeri - Bạn đã sửa đổi nó cho JSHint? Trong trạng thái hiện tại, các chuỗi nó tìm kiếm là dành riêng cho JSLint. –

15

Một số thay đổi đối với tập lệnh @James Allardice để phù hợp với JSHint. Cảm ơn mã ban đầu.

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

Có một dễ dàng hơn cách làm pre-cam kết kiểm tra (ví dụ JSHint) trong workflow Node.js của bạn:

Install jshint từ NPM:

npm install jshint

Tiếp theo, tạo một tệp .jshintrc trong dự án của bạn nếu bạn chưa có. ví dụ: https://github.com/nelsonic/learn-jshint/blob/master/.jshintrc

Bây giờ cài đặt pre-commit mô-đun (và lưu nó như là một sự phụ thuộc dev):

npm install pre-commit --save-dev

Tiếp theo, bạn sẽ cần phải xác định nhiệm vụ (script) mà sẽ được chạy cho JSHint tại của bạn package.json

ví dụ:

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

sau đó bạn đăng ký kịch bản bạn muốn được chạy trước cam kết (cũng trong package.json) ví dụ:

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

này cho phép bạn có nhiều hơn chỉ là một check in của bạn trước khi cam kết quy trình làm việc. (Chúng tôi có kiểm tra để đảm bảo thành viên trong nhóm đang tuân thủ JSHint, Mã Phong cách và Bảo hiểm thử nghiệm là 100%)

Để xem hướng dẫn chi tiết hơn, bạn có thể chia sẻ với nhóm của bạn xem: https://github.com/nelsonic/learn-pre-commit

+0

Xin chào. Bạn có biết cách thiết lập thư mục mà tôi quét không? – AlexeiBerkov

+0

@AlexeiBerkov bạn đang hỏi về thư mục nào bạn muốn 'jshint' để quét? xem: http://jshint.com/docs/cli/ – nelsonic

+0

@nelsonic Là móc trước cam kết chỉ hoạt động với một bộ quy tắc từ jshint? Tôi có thể sử dụng một linter không? – RicardoGonzales

2

Một kịch bản tương tự như @ một igor với một số cải tiến:

  • chỉ số màu
  • không --diff lọc, grep sử dụng INSEAD
  • giúp đỡ nhắn (git phong cách) để tránh pre-cam kết gọi

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

Có vẻ đẹp! :) Đây là * nix chỉ mặc dù. – igor

Các vấn đề liên quan