VS Code 友好的 pre-commit hook
问题:加入 pre-commit 之后,在 VS Code 的侧边栏 git 模块中提交代码看似卡住,看不到 pre-commit 的输出,也无法和 pre-commit 交互。
将下面的 entry_point
函数替换成要执行的流程,然后作为 .git/hooks/pre-commit 的内容即可。其主要作用是判断当前是否在 VS Code 环境中,如果是,则将输出写到一个临时文件中,然后再用 VS Code 打开这个文件以观察输出。解决了看不到输出、进度的问题,但是还解决不了输入的问题。
#!/bin/bash
is_inside_vscode() {
if ([[ "$TERM" == "" ]] || [[ "$TERM" == "dumb" ]]) && [[ "$PATH" == *".vscode-server/"* ]]; then
return 0
fi
return 1
}
print_header() {
echo "############################################################"
echo "# This is the temp file for showing pre-commit output. #"
echo "############################################################"
echo
}
entry_point() { :; }
if is_inside_vscode; then
tmp=$(mktemp)
code $tmp
print_header >$tmp
if ! entry_point >>$tmp 2>&1; then
echo "pre-commit failed, please check $tmp" && false
fi
else
entry_point
fi
Warning
这样的脚本并不总是有效。比如我在 2024 年 3 月 30 日 发现 .vscode-server/bin
开头的路径已经改成了 .vscode-server/cli
,所以又给 PATH 检查去掉了 bin
后缀。