在 Git pre-push hook 中更改 lint 檢查後推送失敗條件

2025年3月11日星期二

工作背景

我們團隊的項目中應用了非常嚴格的 lint 規則,甚至強制要求進行 import 排序。雖然這樣有助於統一代碼風格,但有時在創建 PR 後,CI 中會偶爾出現 lint 錯誤。

雖然不是經常發生,但一旦出現 lint 錯誤,就需要在本地運行腳本修復錯誤,然後重新提交和推送代碼。這不僅繁瑣,而且最終成為拉長代碼審查時間的主要原因之一,因此我建議其他成員在 pre-push hook 中加入 lint 檢查功能。

與其他成員協商一致後,我們利用已存在的 lint-fix:global 腳本編寫了如下 pre-push 鉤子:

echo "🔍 進行 lint 修復..."
pnpm run lint-fix:global

# 檢查是否有變化
if ! git diff --quiet; then
  echo "❌ 修復了一些文件,請在推送前提交更改。"
  exit 1
fi

然而第二天有人反饋說如上代碼存在問題。我認為一些人可能會立刻發現問題所在。

即使不運行 lint-fix:global,也會在儲存一些文件後嘗試推送時失敗。🤦

最終,我認為直接進行 lint error 檢查而不是修復會更好,按照以下代碼進行了修改:

echo "🔍 進行 lint..."

if ! pnpm run lint -- --quiet; then
  echo "❌ 檢測到 Lint 錯誤。"
  echo "👉 要自動修復錯誤,運行: pnpm run lint-fix:global"
  exit 1
fi

上述代碼中的 lint 腳本實際上是運行了 next lint 的腳本。這裡添加了 --quiet 選項,使其僅輸出錯誤,並在檢測到錯誤時輸出錯誤信息並阻止推送。順便也將錯誤信息的顯示更加友好,方便其他成員。

希望此舉可以防止將來再因為 CI 中的 lint錯誤浪費時間。🙏