我的项目目录中有这个bash脚本,命名为shrinkwrap.sh:
update_package_json_changed_files() {
echo "> changed files"
git diff --cached --name-only | grep -x package.json
}
update_shrinkwrap_and_at_to_git_index() {
echo "> Updating npm-shrinkwrap.json and adding to current commit."
npm shrinkwrap
git add npm-shrinkwrap.json
}
if get_package_json_changed_files; then
update_shrinkwrap_and_at_to_git_index
fi
我在package.json中运行此脚本,如下所示:
"scripts": {
"shrinkwrap": "bin/shrinkwrap.sh"
}
我安装了npm pre-commit以执行以下脚本:
"pre-commit": ["shrinkwrap"]
当我尝试提交时,脚本进入infinte循环。它一直在运行,没有什么可以阻止它。我尝试了命令+ C,控制+ Z.没有任何效果。有没有人遇到过这个问题?为什么会这样?
答案 0 :(得分:1)
有可能在文件更改时触发它,并继续更改至少一个文件,该文件依次触发它(在文件更改时),这会使其更改文件,...等等。 / p>
打破这种情况的一种常用方法是生成一个标记文件(touch / tmp / in_progress),并仅在该文件不时才调用update_shrinkwrap_and_at_to_git_index()
。
如果存在,请删除它(但不要做任何其他事情)
所以:
update_shrinkwrap_and_at_to_git_index()
一个touch /tmp/in_progress
和if get_package_json_changed_files;
添加if [ -e /tmp/in_progress ]; then rm /tmp/in_progress; exit 0; fi
之前OP Max Doung评论:
我在
sudo
前面添加了npm shrinkwarp
,它确实停止了循环。当我取出它时,循环重新开始。想知道为什么?
这表明钩子是由用户本地设置触发的(例如~/.gitconfig
中的设置)
使用其他帐户(此处为root
,通过sudo
)执行该命令可避免使用所述全局用户帐户特定设置。