我的项目目录中有一个名为shrinkwrap.sh的bash脚本:
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"]
当我尝试提交时,脚本进入无限循环。它一直在运行,没有什么可以阻止它。我尝试了 command + C、control + Z。没有任何效果。以前有人遇到过这个问题吗?为什么会这样?
它有可能在文件更改时被触发,并继续更改至少一个文件,这又会触发它(在文件更改时),这使其更改文件,这......等等。
打破这种情况的常用方法是生成一个标志文件(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
)将避免使用所述全局用户帐户特定设置。
输入!在 vscode 的 git bash 终端中。