Skip to content

Husky pre-commit フックエラーの解決方法

問題の概要

Gitコミット時に「husky > pre-commit hook failed (add --no-verify to bypass)」というエラーが発生する場合があります。このエラーは、Huskyが設定するpre-commitフックが正常に実行できなかったことを示しています。

典型的なエラーメッセージ例:

husky > npm run -s precommit (node v12.18.3)
'pretty-quick' is not recognized as an internal or external command,
operable program or batch file.
husky > pre-commit hook failed (add --no-verify to bypass)

根本的な原因

このエラーは主に以下の理由で発生します:

  • 依存パッケージの不足またはバージョン不一致
  • .git/hooksディレクトリ内のファイル競合
  • 設定ファイルの不備やスクリプトの誤り
  • 必要なツール(ESLint、Prettierなど)のグローバルインストール不足

解決方法

方法1: Huskyの最新バージョンにアップグレード

Huskyの古いバージョンには既知の問題がある場合があります。最新版にアップグレードしてください:

bash
npm install husky@latest --save-dev

方法2: .git/hooksディレクトリの削除と再インストール

Gitフックの競合を解消するために、既存のフックを削除してから再インストールします:

bash
# .git/hooksディレクトリを削除
rm -rf .git/hooks

# パッケージを再インストール
npm install

方法3: 不足しているパッケージのインストール

エラーメッセージで示されている特定のツール(ESLint、Prettierなど)をインストールします:

bash
# グローバルにインストールする場合
npm install -g eslint prettier

# 開発依存関係としてインストールする場合
npm install --save-dev eslint prettier

方法4: Husky設定の確認と修正

.huskyディレクトリまたはpackage.json内のHusky設定を確認します:

json
// package.jsonの場合
{
  "scripts": {
    "lint": "eslint \"src/**/*.{js,ts,tsx}\" --quiet --fix",
    "precommit": "npm run lint"
  },
  "husky": {
    "hooks": {
      "pre-commit": "npm run lint"
    }
  }
}

方法5: lint-stagedの設定

変更されたファイルのみをリントするようにlint-stagedを設定します:

json
// package.json
{
  "lint-staged": {
    "**/*": "prettier --write --ignore-unknown",
    "src/**/*.{js,ts,tsx}": "eslint --fix"
  }
}

一時的な回避策

緊急の場合には以下のコマンドでフックをスキップできますが、恒久的な解決策ではありません:

bash
git commit -m "コミットメッセージ" --no-verify

WARNING

--no-verifyオプションはコードチェックをスキップするため、品質保証上のリスクがあります。緊急時以外の使用は避けましょう。

推奨される設定

現代的なプロジェクトでは、以下のような設定が推奨されます:

json
{
  "scripts": {
    "prepare": "husky install",
    "lint": "eslint src --ext .js,.ts,.tsx --fix",
    "format": "prettier --write \"src/**/*.{js,ts,tsx,json,css,md}\""
  },
  "devDependencies": {
    "husky": "^9.0.0",
    "lint-staged": "^13.0.0",
    "eslint": "^8.0.0",
    "prettier": "^3.0.0"
  },
  "lint-staged": {
    "*.{js,ts,tsx}": ["eslint --fix", "prettier --write"],
    "*.{json,css,md}": "prettier --write"
  }
}
bash
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

npx lint-staged

まとめ

Huskyのpre-commitフックエラーは、パッケージの不足、設定の問題、またはバージョン不一致によって発生します。根本的な解決のために、依存関係の再インストール、設定の見直し、最新バージョンへのアップグレードを実施してください。一時的な回避策として--no-verifyオプションも利用できますが、コード品質のチェックをスキップするため、恒久的な解決策としての使用は推奨されません。

正しく設定されたHuskyは、コードの品質維持とチーム開発の効率化に大きく貢献します。