最近github でプロジェクトを開始しました。Travis を使用して、コミットするたびに自動テストをセットアップすることができました。しかし今、私は jshint で pre-commit フックをセットアップしたいと思います。したがって、jshint がエラーを報告した場合、コミットは失敗するはずです。しかし、これは可能ですか?もしそうなら、どうすればいいですか?
20242 次
4 に答える
41
しかし、これは可能でしょうか...
はい!これは可能です。私は最近それについて書きました。これは GitHub に固有のものではなく、一般的な Git に固有のものであることに注意してください。これは pre-commit フックであるため、データが GitHub に送信される前に実行されます。
リポジトリの/.git/hooksディレクトリにある適切な名前の実行可能ファイルは、フックとして実行されます。デフォルトで、すでにたくさんのサンプル フックが含まれている可能性があります。これは、JSLint の事前コミット フックとして使用する単純なシェル スクリプトです (代わりに 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 フック ディレクトリにあるpre-commitという名前の実行可能ファイルに入れるだけで、すべてのコミットの前に実行されます。
于 2013-04-02T06:56:27.253 に答える
16
JSHint に対応するための @James Allardiceスクリプトへのいくつかの変更。オリジナルコードありがとうございます。
#!/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
于 2014-01-20T16:17:27.260 に答える
2
@igor のものに似たスクリプトにいくつかの改良を加えたもの:
- カラーインジケーター
- いいえ --diff-filter、grep を insead で使用
- pre-commit 呼び出しを回避するためのヘルプ メッセージ (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
于 2016-09-02T08:59:55.567 に答える