使用退出停止 git 在预提交挂钩中提交
Stop git commit in pre-commit hook with exit
我正在尝试阻止 git 提交继续使用预提交挂钩。通过阅读手册,当您 return 退出代码不是 0 时,它应该停止。我正在测试 csscomb 命令 return 是否有错误,如果有,则中断循环并退出,但 git 提交仍继续通过 git commit (-a)
.
输入消息
我从 https://github.com/filtercake/git-pre-commit-csscomb
分叉并修改了下面的脚本
#!/bin/bash
# pre-commit hook to comb staged .sass and .scss files
# save as .git/hooks/pre-commit
# make executable: chmod +x .git/hooks/pre-commit
# sources:
# http://www.hagenburger.net/BLOG/Using-Git-Commit-Hooks-to-Autocompile-Sass-to-CSS.html
#
#
# https://gist.github.com/openam/8406343
# check if sass/scss files are staged for commit
# diff-lines from
# takes the line
function diff-lines() {
local path=
local line=
while read; do
esc=$'3'
if [[ $REPLY =~ ---\ (a/)?.* ]]; then
continue
elif [[ $REPLY =~ \+\+\+\ (b/)?([^[:blank:]$esc]+).* ]]; then
path=${BASH_REMATCH[2]}
elif [[ $REPLY =~ @@\ -[0-9]+(,[0-9]+)?\ \+([0-9]+)(,[0-9]+)?\ @@.* ]]; then
line=${BASH_REMATCH[2]}
elif [[ $REPLY =~ ^($esc\[[0-9;]+m)*([\ +-]) ]]; then
echo "Line $line:$REPLY"
if [[ ${BASH_REMATCH[2]} != - ]]; then
((line++))
fi
fi
done
}
if ! git diff --quiet --cached -- **/*.{sass,scss}; then
echo ""
echo "--> you checked in sass/scss files. lets comb them..."
echo ""
# check if csscomb is installed
if hash csscomb 2>/dev/null; then
echo -e "3[1;32m--> found csscomb3[0m"
# TODO: check for csscomb update once a week
# check if configfile exists
if [ ! -f ./.csscomb.json ]; then
echo "--> no config file, using defaults"
else
echo -e "3[1;32m--> found .csscomb.json3[0m"
fi
echo ""
# Necessary check for initial commit
against="4b825dc642cb6eb9a060e54bf8d69288fbee4904"
git rev-parse --verify HEAD >/dev/null 2>&1 && against="HEAD"
EXITCODE=0
# (A)dded (C)opied or (M)odified
# encapsulate the loop in {}
git diff-index --cached --full-index --diff-filter=ACM $against | \
{
while read -r line; do
FILE_PATH="$(echo ${line} |cut -d' ' -f6-)"
EXTENSION="${FILE_PATH##*.}"
# EXTENSION=${EXTENSION,,} # Convert to lowercase
REGEX=""
# Select discouraged words based on extension
if [ "${EXTENSION}" = "sass" ] || [ "${EXTENSION}" = "scss" ]; then
echo "--> staged sass/scss file: " $FILE_PATH
echo "--> combing..."
if csscomb $FILE_PATH; then
echo "--> adding combed file"
git add $FILE_PATH
echo "--> done"
else
echo "Check your CSS file for combing errors or alternatively add '-n' to your git commit to bypass this hook"
break
exit 1 # Should stop the git commit from continuing
fi
fi
done
}
else
echo -e "3[0;31m--> Oh noes, CSS Comb is not installed. Do:"
echo "--> npm install csscomb -g"
echo -e "3[0m"
echo "--> (you need to change and stage a sass/scss file again to see it work on the next commit...)"
echo ""
fi
fi
# Necessary check for initial commit
against="4b825dc642cb6eb9a060e54bf8d69288fbee4904"
git rev-parse --verify HEAD >/dev/null 2>&1 && against="HEAD"
EXITCODE=0
exit 0
git diff-index --cached --full-index --diff-filter=ACM $against | \
{
while read -r line; do
麻烦来了。多命令管道阶段在子 shell 中是 运行,并且该循环的出口退出其子 shell。子外壳也有自己的环境,因此您也不能从它们传递变量设置。
while read -r; do
if ! good $REPLY; then exit 1; fi
done <<EOD
$(git diff-index --cached --full-index --diff-filter=ACM $against)
EOD
我正在尝试阻止 git 提交继续使用预提交挂钩。通过阅读手册,当您 return 退出代码不是 0 时,它应该停止。我正在测试 csscomb 命令 return 是否有错误,如果有,则中断循环并退出,但 git 提交仍继续通过 git commit (-a)
.
我从 https://github.com/filtercake/git-pre-commit-csscomb
分叉并修改了下面的脚本#!/bin/bash
# pre-commit hook to comb staged .sass and .scss files
# save as .git/hooks/pre-commit
# make executable: chmod +x .git/hooks/pre-commit
# sources:
# http://www.hagenburger.net/BLOG/Using-Git-Commit-Hooks-to-Autocompile-Sass-to-CSS.html
#
#
# https://gist.github.com/openam/8406343
# check if sass/scss files are staged for commit
# diff-lines from
# takes the line
function diff-lines() {
local path=
local line=
while read; do
esc=$'3'
if [[ $REPLY =~ ---\ (a/)?.* ]]; then
continue
elif [[ $REPLY =~ \+\+\+\ (b/)?([^[:blank:]$esc]+).* ]]; then
path=${BASH_REMATCH[2]}
elif [[ $REPLY =~ @@\ -[0-9]+(,[0-9]+)?\ \+([0-9]+)(,[0-9]+)?\ @@.* ]]; then
line=${BASH_REMATCH[2]}
elif [[ $REPLY =~ ^($esc\[[0-9;]+m)*([\ +-]) ]]; then
echo "Line $line:$REPLY"
if [[ ${BASH_REMATCH[2]} != - ]]; then
((line++))
fi
fi
done
}
if ! git diff --quiet --cached -- **/*.{sass,scss}; then
echo ""
echo "--> you checked in sass/scss files. lets comb them..."
echo ""
# check if csscomb is installed
if hash csscomb 2>/dev/null; then
echo -e "3[1;32m--> found csscomb3[0m"
# TODO: check for csscomb update once a week
# check if configfile exists
if [ ! -f ./.csscomb.json ]; then
echo "--> no config file, using defaults"
else
echo -e "3[1;32m--> found .csscomb.json3[0m"
fi
echo ""
# Necessary check for initial commit
against="4b825dc642cb6eb9a060e54bf8d69288fbee4904"
git rev-parse --verify HEAD >/dev/null 2>&1 && against="HEAD"
EXITCODE=0
# (A)dded (C)opied or (M)odified
# encapsulate the loop in {}
git diff-index --cached --full-index --diff-filter=ACM $against | \
{
while read -r line; do
FILE_PATH="$(echo ${line} |cut -d' ' -f6-)"
EXTENSION="${FILE_PATH##*.}"
# EXTENSION=${EXTENSION,,} # Convert to lowercase
REGEX=""
# Select discouraged words based on extension
if [ "${EXTENSION}" = "sass" ] || [ "${EXTENSION}" = "scss" ]; then
echo "--> staged sass/scss file: " $FILE_PATH
echo "--> combing..."
if csscomb $FILE_PATH; then
echo "--> adding combed file"
git add $FILE_PATH
echo "--> done"
else
echo "Check your CSS file for combing errors or alternatively add '-n' to your git commit to bypass this hook"
break
exit 1 # Should stop the git commit from continuing
fi
fi
done
}
else
echo -e "3[0;31m--> Oh noes, CSS Comb is not installed. Do:"
echo "--> npm install csscomb -g"
echo -e "3[0m"
echo "--> (you need to change and stage a sass/scss file again to see it work on the next commit...)"
echo ""
fi
fi
# Necessary check for initial commit
against="4b825dc642cb6eb9a060e54bf8d69288fbee4904"
git rev-parse --verify HEAD >/dev/null 2>&1 && against="HEAD"
EXITCODE=0
exit 0
git diff-index --cached --full-index --diff-filter=ACM $against | \
{
while read -r line; do
麻烦来了。多命令管道阶段在子 shell 中是 运行,并且该循环的出口退出其子 shell。子外壳也有自己的环境,因此您也不能从它们传递变量设置。
while read -r; do
if ! good $REPLY; then exit 1; fi
done <<EOD
$(git diff-index --cached --full-index --diff-filter=ACM $against)
EOD