Git 设置预提交钩子jshint

Git 设置预提交钩子jshint,git,github,jshint,pre-commit-hook,Git,Github,Jshint,Pre Commit Hook,我最近开了一家公司。 我已经成功地使用Travis在每次提交后设置了自动测试。但是现在我也想用jshint设置一个预提交钩子。因此,如果jshint报告错误,那么提交应该失败。但这可能吗?如果可能,怎么做 但这有可能吗 对!!这是可能的。我请注意,它不是GitHub特有的,只是一般的Git—因为它是一个预提交钩子,它在任何数据发送到GitHub之前运行 存储库的/.git/hooks目录中任何适当命名的可执行文件都将作为钩子运行。默认情况下,那里可能已经有一堆示例钩子。我将其用作JSLint预提

我最近开了一家公司。 我已经成功地使用Travis在每次提交后设置了自动测试。但是现在我也想用jshint设置一个预提交钩子。因此,如果jshint报告错误,那么提交应该失败。但这可能吗?如果可能,怎么做

但这有可能吗

对!!这是可能的。我请注意,它不是GitHub特有的,只是一般的Git—因为它是一个预提交钩子,它在任何数据发送到GitHub之前运行

存储库的/.git/hooks目录中任何适当命名的可执行文件都将作为钩子运行。默认情况下,那里可能已经有一堆示例钩子。我将其用作JSLint预提交钩子(您可以非常轻松地修改它以使用JSHint):


您只需将其放在Git hooks目录中名为pre commit的可执行文件中,它将在每次提交之前运行。

对@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
在Node.js工作流中有一种更简单的方法来进行提交前检查(例如JSHint):

从NPM安装:

npm安装jshint

接下来在项目中创建一个.jshintrc文件(如果您还没有)。 e、 g:

现在安装模块(并将其另存为开发人员依赖项):

npm安装预提交--保存开发

接下来,您需要定义将在包中为JSHint运行的任务(脚本)。json

e、 g:

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

然后注册要在提交前运行的脚本(也在package.json中),例如:

“预提交”:[“jshint”、“coverage”、“etc”]

这允许您在预提交工作流中进行多个检查。 (我们进行了检查,以确保团队成员的代码符合JSHint,代码样式和测试覆盖率为100%)


有关更详细的教程,您可以与您的团队共享,请参见:

与@igor的脚本类似的脚本,但有一些改进:

  • 颜色指示器
  • 否--差异过滤器,grep用于欧洲工商管理学院
  • 帮助消息(git样式)以避免预提交调用

#/垃圾箱/垃圾箱
#
#在提交之前运行JSHint验证。
红色='\033[0;31m'
红色粗体='\033[1;31m'
橙色='\033[0;33米'
NC='\033[0m'#无颜色
files=$(git diff--cached--name only | grep.js)
通过=正确
totalErrors=0
如果[“$files”!=”];则
对于${files};do中的文件
结果=$(jshint${file})
如果[“$result”!=”];则
回显“${RED}$result${NC}”
通过=错误
totalErrors=$((totalErrors+1))
fi
回声“”
完成
fi
如果$pass;那么
出口0
其他的
echo“${ORANGE}===${totalErrors}JSHint Error${NC}”
回声“”
echo“${REDBOLD}提交失败:某些JavaScript文件无效。请修复错误,然后重试提交。${NC}”
回声“”
echo“(使用-n选项\“git commit-n-m \”避免调用预提交钩子和JSHint检查)”
回声“”
出口1
fi

thnx很多!!但是,我一定是做错了什么,因为我无法让它工作。我在.git/hooks中创建了文件并使其可执行。现在,当我提交一个带有“太多错误”的文件时,它只会提交它。另外,当我手动运行钩子时,我会被困在/bin/sh中。现在,当我键入“退出”时,我会得到“提交失败”消息。有什么建议吗?我刚刚注意到,即使是'git init'项目中的预提交钩子也不起作用。所以我发现预提交钩子应该命名为'pre commit':),所以它现在工作得很好。我将jsLint修改为jsHint,将grep修改为:“egrep”错误$“。但是如果我想要多个预提交钩子,那可能吗?很高兴你让它工作了:)据我所知,不幸的是你不能有多个钩子。最简单的方法是将它们合并到一个文件中。对于那些想知道JSHint的最终版本是什么样子的人:请注意grep中有错误。应该是
“\.js$"
Hi.你知道如何设置wana扫描的文件夹吗?@AlexeiBerkov你想知道你想扫描哪个文件夹吗
jshint
?请参阅:@nelsonic Is pre-commit hook仅适用于jshint中的一组规则?我可以使用另一个linter吗?@RicardoGonzales你可以使用
pre-commit
中的任何命令,所以是的,任何其他linter都将使用ork.:-@nelsonic很奇怪,因为我的皮棉不起作用,只是暂停了一下,看起来不错!:)这只是*尼克斯而已。
#!/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
#!/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