git 上的 eslint 预提交
eslint pre-commiot on git
我如何 运行 在添加阶段文件的预提交脚本 eslint 中?
我在 hooks 文件夹中有 .eslintrc 文件。
我也有剧本:
#!/bin/sh
#
# An example hook script to verify what is about to be committed.
# Called by "git commit" with no arguments. The hook should
# exit with non-zero status after issuing an appropriate message if
# it wants to stop the commit.
#
# To enable this hook, rename this file to "pre-commit".
function lintit () {
a=("${(f)$(git diff --name-only | grep -E '(.js)$')}")
e=$(eslint -c eslint.json $a)
echo $e
if [[ "$e" != *"0 problems"* ]]; then
echo "ERROR: Check eslint hints."
exit 1 # reject
fi
}
lintit
但它不执行我在 .eslintc 文件中的 eslint。
谢谢!
我发现您的脚本有两个(可能的)问题:
- 该文件可能没有设置可执行标志
- 你的子shell表达式有误
Git 除非它在 unixoid 系统上有适当的可执行标志,否则不会执行。
$ chmod ug+x .git/hooks/pre-commit
如果您还没有看到任何错误消息,可能是因为这个原因。
但是,无论如何这是不正确的,这是一个语法错误:
a=("${(f)$(git diff --name-only | grep -E '(.js)$')}")
e=$(eslint -c eslint.json $a)
更好:
a="$( git diff --name-only | grep -E '(.js)$' )"
e=$( eslint -c eslint.json $a )
进一步改进
简化结果检查
如果发现错误,eslint 将以负(非零)退出代码退出。
eslint ${ESLINT_CONF} $( ... )
if [ $? -ne 0 ]; then
echo "eslint is unhappy."
exit 1
fi
如果不需要 echo
,那么在最后一行添加 eslint
语句就足够了,因此 shell 将以该命令的退出代码退出。
但是,使用退出代码的缺点是,由于 eslint 在警告时确实以正代码(零)退出,因此您将无法检测到警告。在那种情况下,您仍然必须匹配警告。
不仅检查修改过的文件
您的 git diff
表达式将找不到新文件。您可能想改用 git status
:
git status --porcelain | awk '{print }' | grep -E '(.js)$'
最终剧本
#!/bin/sh
ESLINT_CONF=".eslintrc.json"
eslint ${ESLINT_CONF} $( git status --porcelain | awk '{print }' | grep -E '(.js)$' ) >/dev/null
if [ $? -ne 0 ]; then
echo "ERROR: Check eslint hints."
exit 1
fi
exit 0
或者,简化...
#!/bin/sh
ESLINT_CONF=".eslintrc.json"
eslint ${ESLINT_CONF} $( git status --porcelain | awk '{print }' | grep -E '(.js)$' ) >/dev/null
或者,检查警告...
#!/bin/sh
ESLINT_CONF=".eslintrc.json"
RES="( eslint ${ESLINT_CONF} $( git status --porcelain | awk '{print }' | grep -E '(.js)$' ) )"
if [ $? -ne 0 ] || [[ "${RES}" != *"0 warning"* ]]; then
echo "ERROR: Check eslint hints."
exit 1
fi
删除 >/dev/null
(脚本 1 和 2)或 echo "${RES}"
(脚本 3)以显示 eslint 的输出。
我如何 运行 在添加阶段文件的预提交脚本 eslint 中?
我在 hooks 文件夹中有 .eslintrc 文件。
我也有剧本:
#!/bin/sh
#
# An example hook script to verify what is about to be committed.
# Called by "git commit" with no arguments. The hook should
# exit with non-zero status after issuing an appropriate message if
# it wants to stop the commit.
#
# To enable this hook, rename this file to "pre-commit".
function lintit () {
a=("${(f)$(git diff --name-only | grep -E '(.js)$')}")
e=$(eslint -c eslint.json $a)
echo $e
if [[ "$e" != *"0 problems"* ]]; then
echo "ERROR: Check eslint hints."
exit 1 # reject
fi
}
lintit
但它不执行我在 .eslintc 文件中的 eslint。
谢谢!
我发现您的脚本有两个(可能的)问题:
- 该文件可能没有设置可执行标志
- 你的子shell表达式有误
Git 除非它在 unixoid 系统上有适当的可执行标志,否则不会执行。
$ chmod ug+x .git/hooks/pre-commit
如果您还没有看到任何错误消息,可能是因为这个原因。
但是,无论如何这是不正确的,这是一个语法错误:
a=("${(f)$(git diff --name-only | grep -E '(.js)$')}")
e=$(eslint -c eslint.json $a)
更好:
a="$( git diff --name-only | grep -E '(.js)$' )"
e=$( eslint -c eslint.json $a )
进一步改进
简化结果检查
如果发现错误,eslint 将以负(非零)退出代码退出。
eslint ${ESLINT_CONF} $( ... )
if [ $? -ne 0 ]; then
echo "eslint is unhappy."
exit 1
fi
如果不需要 echo
,那么在最后一行添加 eslint
语句就足够了,因此 shell 将以该命令的退出代码退出。
但是,使用退出代码的缺点是,由于 eslint 在警告时确实以正代码(零)退出,因此您将无法检测到警告。在那种情况下,您仍然必须匹配警告。
不仅检查修改过的文件
您的 git diff
表达式将找不到新文件。您可能想改用 git status
:
git status --porcelain | awk '{print }' | grep -E '(.js)$'
最终剧本
#!/bin/sh
ESLINT_CONF=".eslintrc.json"
eslint ${ESLINT_CONF} $( git status --porcelain | awk '{print }' | grep -E '(.js)$' ) >/dev/null
if [ $? -ne 0 ]; then
echo "ERROR: Check eslint hints."
exit 1
fi
exit 0
或者,简化...
#!/bin/sh
ESLINT_CONF=".eslintrc.json"
eslint ${ESLINT_CONF} $( git status --porcelain | awk '{print }' | grep -E '(.js)$' ) >/dev/null
或者,检查警告...
#!/bin/sh
ESLINT_CONF=".eslintrc.json"
RES="( eslint ${ESLINT_CONF} $( git status --porcelain | awk '{print }' | grep -E '(.js)$' ) )"
if [ $? -ne 0 ] || [[ "${RES}" != *"0 warning"* ]]; then
echo "ERROR: Check eslint hints."
exit 1
fi
删除 >/dev/null
(脚本 1 和 2)或 echo "${RES}"
(脚本 3)以显示 eslint 的输出。