メインコンテンツへスキップ

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

これによりhuskylint-stagedがインストールされ、プロジェクトのpackage.jsonに設定が追加されます。これによりpre-commitフックでサポート対象ファイルが自動フォーマットされます。

詳細はlint-stagedリポジトリを参照してください。

オプション2. pretty-quick

使用例: 変更済み/ステージング済みファイルの全体フォーマットが必要な場合に最適です。

simple-git-hooksと共にインストールします:

npm install --save-dev simple-git-hooks pretty-quick
node --eval "fs.writeFileSync('.simple-git-hooks.json',JSON.stringify({'pre-commit':'npx pretty-quick --staged'},undefined,2)+'\n')"
npx 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タスクを追加できます。

task-runner.json
{
"command": "npx",
"args": ["prettier", "--ignore-unknown", "--write", "${staged}"],
"pathMode": "absolute"
}

オプション4. git-format-staged

使用例: 部分的にステージングされたファイルをフォーマットしたいが、他のオプションがプロジェクトに適合しない場合に最適です。

git-format-stagedは、stdin経由でファイルコンテンツを受け取れるフォーマッタを実行します。部分的ステージングファイルを扱う他のツールとは異なり、gitオブジェクトデータベース内のオブジェクトに直接フォーマッタを適用し、変更をワーキングツリーにマージします。この手法により以下が保証されます:

  1. コミット内の変更は常にフォーマットされます。

  2. ステージングされていない変更は、いかなる状況でもフォーマットプロセス中にステージングされません。

  3. フォーマット済みステージング変更と未ステージング変更が競合する場合、ワーキングツリーファイルは変更されません(作業が上書きされず、クリーンアップすべきスタッシュも発生しません)。

  4. ステージングされていない変更はフォーマットされません。

git-format-stagedにはPython v3またはv2.7が必要です。Pythonは通常Linux/macOSにプリインストールされていますが、Windowsには含まれません。huskyと共に使用します:

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')"

プロジェクトに合わせてファイル拡張子を追加/削除してください。どの拡張子を指定しても、フォーマットはプロジェクト内の.prettierignoreファイルを常に尊重します。

git-format-stagedの動作詳細はAutomatic Code Formatting for Partially-Staged Filesを参照してください。

オプション5. Shellスクリプト

代わりにこのスクリプトを.git/hooks/pre-commitとして保存し、実行権限を付与できます:

.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に追加してください:

.git/hooks/post-commit
#!/bin/sh
git update-index -g