Pre-commit フック
このページは PageTurner AI で翻訳されました(ベータ版)。プロジェクト公式の承認はありません。 エラーを見つけましたか? 問題を報告 →
Prettierをpre-commitツールと併用できます。git addで「ステージング」されたファイルをコミット前に再フォーマットできます。
オプション1. lint-staged
使用例: Prettierと他のコード品質ツール(ESLint、Stylelintなど)を併用したい場合、または部分的なステージングファイル(git add --patch)のサポートが必要な場合に便利です。
事前にPrettierがインストールされ、devDependenciesに含まれていることを確認してください。
npx mrm@2 lint-staged
これによりhuskyとlint-stagedがインストールされ、プロジェクトのpackage.jsonに設定が追加されます。これによりpre-commitフックでサポート対象ファイルが自動フォーマットされます。
詳細はlint-stagedリポジトリを参照してください。
オプション2. pretty-quick
使用例: 変更済み/ステージング済みファイルの全体フォーマットが必要な場合に最適です。
simple-git-hooksと共にインストールします:
- npm
- yarn
- pnpm
- bun
npm install --save-dev simple-git-hooks pretty-quick
echo '{\n "pre-commit": "npx pretty-quick --staged"\n}\n' > .simple-git-hooks.json
npx simple-git-hooks
yarn add --dev simple-git-hooks pretty-quick
echo '{\n "pre-commit": "yarn pretty-quick --staged"\n}\n' > .simple-git-hooks.json
yarn simple-git-hooks
pnpm add --save-dev simple-git-hooks pretty-quick
echo '{\n "pre-commit": "pnpm pretty-quick --staged"\n}\n' > .simple-git-hooks.json
pnpm simple-git-hooks
bun add --dev simple-git-hooks pretty-quick
echo '{\n "pre-commit": "bun pretty-quick --staged"\n}\n' > .simple-git-hooks.json
bun simple-git-hooks
詳細はpretty-quickリポジトリを参照してください。
オプション3. Husky.Net
使用例: Prettierを他のコード品質ツール(dotnet-format、ESLint、Stylelintなど)と併用するdotnetソリューション。複数のファイル状態(staged - last-commit、git-filesなど)をサポートします。
dotnet new tool-manifest
dotnet tool install husky
dotnet husky install
dotnet husky add pre-commit
インストール後、task-runner.jsonにPrettierタスクを追加できます。
{
"command": "npx",
"args": ["prettier", "--ignore-unknown", "--write", "${staged}"],
"pathMode": "absolute"
}
オプション4. git-format-staged
使用例: 部分的にステージングされたファイルをフォーマットしたいが、他のオプションがプロジェクトに適合しない場合に最適です。
git-format-stagedは、stdin経由でファイルコンテンツを受け取れるフォーマッタを実行します。部分的ステージングファイルを扱う他のツールとは異なり、gitオブジェクトデータベース内のオブジェクトに直接フォーマッタを適用し、変更をワーキングツリーにマージします。この手法により以下が保証されます:
-
コミット内の変更は常にフォーマットされます。
-
ステージングされていない変更は、いかなる状況でもフォーマットプロセス中にステージングされません。
-
フォーマット済みステージング変更と未ステージング変更が競合する場合、ワーキングツリーファイルは変更されません(作業が上書きされず、クリーンアップすべきスタッシュも発生しません)。
-
ステージングされていない変更はフォーマットされません。
git-format-stagedにはPython v3またはv2.7が必要です。Pythonは通常Linux/macOSにプリインストールされていますが、Windowsには含まれません。huskyと共に使用します:
- npm
- yarn
- pnpm
- bun
npx husky init
npm install --save-dev git-format-staged
node --eval "fs.writeFileSync('.husky/pre-commit', 'git-format-staged -f \'prettier --ignore-unknown --stdin --stdin-filepath \"{}\"\' .\n')"
yarn husky init
yarn add --dev git-format-staged
node --eval "fs.writeFileSync('.husky/pre-commit', 'git-format-staged -f \'prettier --ignore-unknown --stdin --stdin-filepath \"{}\"\' .\n')"
pnpm exec husky init
pnpm add --save-dev git-format-staged
node --eval "fs.writeFileSync('.husky/pre-commit', 'git-format-staged -f \'prettier --ignore-unknown --stdin --stdin-filepath \"{}\"\' .\n')"
bunx husky init
bun add --dev git-format-staged
bun --eval "fs.writeFileSync('.husky/pre-commit', 'git-format-staged -f \'prettier --ignore-unknown --stdin --stdin-filepath \"{}\"\' .\n')"
プロジェクトに合わせてファイル拡張子を追加/削除してください。どの拡張子を指定しても、フォーマットはプロジェクト内の.prettierignoreファイルを常に尊重します。
git-format-stagedの動作詳細はAutomatic Code Formatting for Partially-Staged Filesを参照してください。
オプション5. Shellスクリプト
代わりにこのスクリプトを.git/hooks/pre-commitとして保存し、実行権限を付与できます:
#!/bin/sh
FILES=$(git diff --cached --name-only --diff-filter=ACMR | sed 's| |\\ |g')
[ -z "$FILES" ] && exit 0
# Prettify all selected files
echo "$FILES" | xargs ./node_modules/.bin/prettier --ignore-unknown --write
# Add back the modified/prettified files to staging
echo "$FILES" | xargs git add
exit 0
コミット後もPrettierで整形されたファイルが変更された状態とGitが報告する場合、post-commitスクリプトを追加してGitのインデックスを更新する必要があるかもしれません。
以下のようなスクリプトを.git/hooks/post-commitに追加してください:
#!/bin/sh
git update-index -g