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
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.
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
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
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
@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
@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
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
Có vẻ đẹp! :) Đây là * nix chỉ mặc dù. – igor
- 1. móc trước cam kết phía máy khách trong subversion
- 2. Dừng một git cam kết bởi một tác giả cụ thể bằng cách sử dụng móc trước cam kết
- 3. thiết lập móc git sau khi nhận
- 4. Muốn thiết lập móc sao chép các tệp đã cam kết vào một thư mục cụ thể
- 5. Kiểm tra những gì sắp sửa được thực hiện trong một móc trước cam kết
- 6. Cách tạo một móc trước cam kết ngăn mã hóa tệp không phải UTF-8
- 7. Git trước nhận móc
- 8. sử dụng móc git sau khi cam kết
- 9. Thiết lập móc trên tin nhắn Windows
- 10. Xóa cam kết trước cam kết cụ thể
- 11. Sử dụng móc cam kết xuất khẩu trong VisualSVN Server
- 12. Tôi làm cách nào để nhắc người dùng từ trong móc móc cam kết?
- 13. Sử dụng Git từ cam-msg móc
- 14. Subversion: Cách xem trước cam kết?
- 15. xem xét mã trước cam kết
- 16. git: squash/fixup trước đó cam kết
- 17. Git ký tắt cam kết trước đó?
- 18. Khôi phục cam kết git trước đó?
- 19. Biết mã GIT trước khi cam kết?
- 20. Thiết lập trước before_filter authenticate_admin?
- 21. móc trước cam kết trong svn: không thể được dịch từ ngôn ngữ bản địa sang UTF-8
- 22. Móc điều kiện trước cam kết có điều khiển từ dòng lệnh cho GIT: Có thể không?
- 23. SVN Lỗi: Cam kết bị chặn bởi móc trước (đầu ra mã 1) với đầu ra: Lỗi: n/a (6)
- 24. Đẩy mà không cam kết
- 25. Sử dụng móc hậu cần SVN để chỉ cập nhật các tệp đã được cam kết
- 26. Gitorious có móc cho thông báo cam kết của CIA không?
- 27. Sửa đổi một cam kết đó không phải là trước đó cam kết
- 28. Cho phép SVN cam kết với các cảnh báo móc PreCommit hiện có
- 29. Thiết lập gọi lại sau khi giao dịch đã cam kết
- 30. Cách dễ nhất/tốt nhất để thiết lập các email cam kết SVN?
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 ? –
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: ( –
@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. –