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 后缀。