diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts index c48012b6d..5cf9420ce 100644 --- a/docs/.vitepress/config.mts +++ b/docs/.vitepress/config.mts @@ -121,5 +121,30 @@ export default defineConfig({ ], }, }, + jp: { + label: "日本語", + lang: "ja-JP", + description: "Git フックを簡単に", + link: "/jp/", + themeConfig: { + sidebar: [ + { text: "はじめに", link: "/jp/" }, + { text: "始めましょう", link: "/jp/get-started" }, + { text: "方法", link: "/jp/how-to" }, + { text: "トラブルシュート", link: "/jp/troubleshoot" }, + { text: "v4からの移行", link: "/jp/migrate-from-v4" }, + ], + docFooter: { + prev: "前のページ", + next: "次のページ", + }, + outline: { + label: "ページナビゲーション", + }, + nav: [ + { text: "スポンサー", link: "https://github.com/sponsors/typicode" }, + ], + }, + }, }, }); diff --git a/docs/jp/get-started.md b/docs/jp/get-started.md new file mode 100644 index 000000000..3d6a5fd07 --- /dev/null +++ b/docs/jp/get-started.md @@ -0,0 +1,80 @@ +# 始めましょう + +## インストール + +::: code-group + +```shell [npm] +npm install --save-dev husky +``` + +```shell [pnpm] +pnpm add --save-dev husky +``` + +```shell [yarn] +yarn add --dev husky +# パッケージが private でない場合のみ、 pinst を追加してください +yarn add --dev pinst +``` + +```shell [bun] +bun add --dev husky +``` + +::: + +## `husky init` (推奨) + +`init` コマンドは、プロジェクトでの husky のセットアップを簡単にします。 `.husky/` に `pre-commit` スクリプトを作成し、 `package.json` の `prepare` スクリプトを更新します。ワークフローに合わせて後で修正することもできます。 + +::: code-group + +```shell [npm] +npx husky init +``` + +```shell [pnpm] +pnpm exec husky init +``` + +```shell [yarn] +# 特定の注意事項や他のパッケージ・マネージャーとの違いがあるため、 +# 方法セクションを参照してください +``` + +```shell [bun] +bunx husky init +``` + +::: + + +## 試してみる + +おめでとうございます! たったひとつのコマンドで、最初の Git フックを設定することができました🎉。テストしてみましょう: + +```shell +git commit -m "Keep calm and commit" +# コミットする度にテストスクリプトが実行されます +``` + +## ひと言... + +### スクリプティング + +ほとんどの場合、 `npm run` または `npx` コマンドをフックで実行するだけですが、 POSIX Shell を使ってスクリプト化し、カスタムワークフローを作成することもできます。 + +例えば、たった2行の Shell コードと外部依存なしで、コミット毎にステージファイルを lint する方法はこちらです: + +```shell +# .husky/pre-commit +prettier $(git diff --cached --name-only --diff-filter=ACMR | sed 's| |\\ |g') --write --ignore-unknown +git update-index --again +``` + +_これは基本的な、しかし実用的な例です。更に必要であれば、 [lint-staged](https://github.com/lint-staged/lint-staged) をチェックしてください。_ + +### フックを無効にする + +Husky は Git フックを強制しません。必要に応じて、グローバルに無効にすること(`HUSKY=0`)やオプトインすることもできます。手動での設定や詳細については、[方法](./how-to.md)セクションを参照してください。 \ No newline at end of file diff --git a/docs/jp/how-to.md b/docs/jp/how-to.md new file mode 100644 index 000000000..2be52e359 --- /dev/null +++ b/docs/jp/how-to.md @@ -0,0 +1,325 @@ +# 方法 + +## 新しいフックの追加 + +フックの追加はファイルの作成と同じくらい簡単です。お気に入りのエディターやスクリプト、あるいは基本的な echo コマンドを使って行うことができます。例えば、 Linux/macOS の場合: +```shell +echo "npm test" > .husky/pre-commit +``` + +## 起動ファイル + +Husky では、フックを実行する前にローカルコマンドを実行することができます。これらのファイルからコマンドを読み込みます: + +- `$XDG_CONFIG_HOME/husky/init.sh` +- `~/.config/husky/init.sh` +- `~/.huskyrc` (非推奨) + +Windows の場合: `C:\Users\yourusername\.config\husky\init.sh` + +## Git フックのスキップ + +### 単一のコマンドの場合 + +ほとんどの Git コマンドには、フックをスキップする `-n/--no-verify` オプションがあります: + +```sh +git commit -m "..." -n # Git フックをスキップ +``` + +このフラグがないコマンドでは、 HUSKY=0 で一時的にフックを無効にします: + +```shell +HUSKY=0 git ... # 全ての Git フック を一時的に無効にする +git ... # フックが再度動く +``` + +### 複数のコマンドの場合 + +長期間フックを無効にする (リベース/マージ中など): + +```shell +export HUSKY=0 # 全ての Git フック を無効にする +git ... +git ... +unset HUSKY # フックを再度有効にする +``` + +### GUI または グローバル + +GUI クライアントまたはグローバルで Git フックを無効にするには、 husky の設定を変更します: + +```sh +# ~/.config/husky/init.sh +export HUSKY=0 # Husky がマシンにインストールされず、フックも実行されない +``` + +## CIサーバ と Docker + +Git フックを CI サーバや Docker にインストールしないようにするには、 `HUSKY=0` を使います。例えば、 GitHub Actions では: + +```yml +# https://docs.github.com/en/actions/learn-github-actions/variables +env: + HUSKY: 0 +``` + +( `devDependencies` ではなく) `dependencies` のみをインストールする場合、 `"prepare": "husky"` スクリプトは Husky がインストールされないため、失敗する可能性があります。 + +複数の解決策があります。 + +失敗することがないように `prepare` スクリプトを修正する: + +```json +// package.json +"prepare": "husky || true" +``` + +それでも出力に `command not found` というエラーメッセージが表示され、混乱するかもしれません。表示させないようにするには、 `.husky/install.mjs` を作成してください: + +```js +// 本番環境と CI で Husky のインストールをスキップする +if (process.env.NODE_ENV === 'production' || process.env.CI === 'true') { + process.exit(0) +} +const husky = (await import('husky')).default +console.log(husky()) +``` + +そして、それを `prepare` で使用します: + +```json +"prepare": "node .husky/install.mjs" +``` + +## コミットせずにフックをテストする + +フックをテストするには、フックスクリプトに `exit 1` を追加して Git コマンドを中断させます: + +```shell +# .husky/pre-commit + +# あなたの作業中スクリプト +# ... + +exit 1 +``` + +```shell +git commit -m "testing pre-commit code" +# コミットは作成されない +``` + +## Git のルートディレクトリにプロジェクトがない + +Husky はセキュリティ上の理由から、親ディレクトリ(`../`)にはインストールされません。ただし、 `prepare` スクリプトでディレクトリを変更することができます。 + +このプロジェクトの構成を考えてみましょう: + +``` +. +├── .git/ +├── backend/ # package.json がない +└── frontend/ # husky を使用した package.json がある +``` + +prepare スクリプトを次のように設定します: + +```json +"prepare": "cd .. && husky frontend/.husky" +``` + +フックスクリプトで、ディレクトリを関連するサブディレクトリに戻します: + +```shell +# frontend/.husky/pre-commit +cd frontend +npm test +``` + +## shell ではないフック + +スクリプト言語の使用を必要とするスクリプトを実行するには、該当するフック毎に以下のパターンを使用します: + +( `pre-commit` フックと NodeJS を使用した例) +1. フックのエントリーポイントを作る: + ```shell + .husky/pre-commit + ``` +2. 作成したファイルに以下を追加する + ```shell + node .husky/pre-commit.js + ``` +3. `.husky/pre-commit.js` の中 + ```javascript + // あなたの NodeJS コード + // ... + ``` + +## Bash + +フックスクリプトは、( Windows ユーザーなど)全ての人が `bash` を使っているわけではないので、十分な互換性を確保するために POSIX 準拠である必要があります。 + +とはいえ、もしあなたのチームが Windows を使わないのであれば、次のように Bash を使うことができます: + +```shell +# .husky/pre-commit + +bash << EOF +# 中に bash のスクリプトを入れる +# ... +EOF +``` + +## Node バージョン・マネージャーと GUI + +バージョン・マネージャー(`nvm`, `n`, `fnm`, `asdf`, `volta` など)を使って Node をインストールした GUI で Git フックを使っている場合、環境変数 `PATH` の問題で `command not found` エラーに直面するかもしれません。 + +### `PATH` とバージョン・マネージャーを理解する + +`PATH` はディレクトリのリストを含む環境変数です。 Shell はこれらのディレクトリを検索してコマンドを探します。コマンドが見つからなければ、 `command not found` というメッセージが表示されます。 + +Shell で `echo $PATH` を実行すると、その内容が表示されます。 + +バージョン・マネージャーは次のように動作します: +1. Shell のスタートアップファイル(`.zshrc`, `.bashrc` など)に初期化コードを追加し、ターミナルを開く度に実行する。 +2. ホームフォルダ内のディレクトリに Node のバージョンをダウンロードする。 + +例えば、2つの Node バージョンが入っている場合: + +```shell +~/version-manager/Node-X/node +~/version-manager/Node-Y/node +``` + +ターミナルを開くとバージョン・マネージャーが初期化され、バージョン(例えば `Node-Y` )を選び、そのパスを `PATH` の前に追加します: + +```shell +echo $PATH +# 出力 +~/version-manager/Node-Y/:... +``` + +今、 Node は `Node-Y` を参照しています。 `Node-X` に切り替えると、それに応じて `PATH` も変更されます: + +```shell +echo $PATH +# 出力 +~/version-manager/Node-X/:... +``` + +この問題は、ターミナルの外で起動した GUI がバージョン・マネージャーを初期化せず、 `PATH` に Node のインストール・パスが残らないため発生します。そのため、 GUI から Git フックはしばしば失敗します。 + +### 解決方法 + +Husky のソース `~/.config/husky/init.sh` を各 Git フックの前にコピーします。バージョン・マネージャーの初期化コードをここにコピーして、 GUI で実行できるようにします。 + +`nvm` を使った例: + +```shell +# ~/.config/husky/init.sh +export NVM_DIR="$HOME/.nvm" +[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # これは nvm をロードします +``` + +あるいは、 Shell のスタートアップファイルが高速で軽量であれば、それを直接ソースにします: + +```shell +# ~/.config/husky/init.sh +. ~/.zshrc +``` + +## 手動セットアップ + +Git を設定し、 husky が `.husky/` にファイルをセットアップする必要があります。 + +リポジトリで `husky`コマンドを一度実行します。理想的には、 `package.json` の `prepare` スクリプトにこのコマンドを含めて、インストールの度に自動実行するようにします(推奨)。 + +::: code-group + +```json [npm] +{ + "scripts": { + "prepare": "husky" // [!code hl] + } +} +``` + +```json [pnpm] +{ + "scripts": { + "prepare": "husky" // [!code hl] + } +} +``` + +```json [yarn] +{ + "scripts": { + // Yarn は prepare スクリプトをサポートしていません + "postinstall": "husky", + // npmjs.com に publish する場合は、これを含めます + "prepack": "pinst --disable", + "postpack": "pinst --enable" + } +} +``` + +```json [bun] +{ + "scripts": { + "prepare": "husky" // [!code hl] + } +} +``` + +::: + +一度 `prepare` を実行します: + +::: code-group + +```sh [npm] +npm run prepare +``` + +```sh [pnpm] +pnpm run prepare +``` + +```sh [yarn] +# Yarn は prepare スクリプトをサポートしていません +yarn run postinstall +``` + +```sh [bun] +bun run prepare +``` + +::: + +`.husky/` ディレクトリに `pre-commit` ファイルを作成します: + +::: code-group + +```shell [npm] +# .husky/pre-commit +npm test +``` + +```shell [pnpm] +# .husky/pre-commit +pnpm test +``` + +```shell [yarn] +# .husky/pre-commit +yarn test +``` + +```sh [bun] +# .husky/pre-commit +bun test +``` + +::: diff --git a/docs/jp/index.md b/docs/jp/index.md new file mode 100644 index 000000000..47c522b15 --- /dev/null +++ b/docs/jp/index.md @@ -0,0 +1,82 @@ +![npm](https://img.shields.io/npm/dm/husky) + +> 超高速でモダンなネイティブ git フック + +Husky はあなたのコミットを更に強化します 🐶 _ウー!_ + +コミットやプッシュ時に、**コミットメッセージやコードを自動的にlint**し、**テストを実行**します。 + +まずは [ここ](./get-started.md) から。 + +## 特徴 + +- わずか `2 kB` (📦 _gzip圧縮_)、依存関係なし +- 軽量なため最速 (`~1ms`で動作) +- Git の新機能を使用 (`core.hooksPath`) +- サポート: + - macOS, Linux, Windows + - Git GUI, Node バージョン・マネージャ, カスタムフックディレクトリ, ネストされたプロジェクト, モノレポ + - [クライアントサイドの Git フック 全13種](https://git-scm.com/docs/githooks) + +その他にも: + +- ブランチ特有のフック +- POSIX shell を使った高度なスクリプト +- Git ネイティブのフック構成に従う +- `prepare` スクリプトを使った [npm](https://docs.npmjs.com/cli/v10/using-npm/scripts#best-practices) のベストプラクティスに合わせる +- オプトイン/オプトアウト オプション +- グローバルに無効化可能 +- ユーザーフレンドリーなエラーメッセージ + +## スポンサー + +[ここ](https://github.com/sponsors/typicode) からスポンサーになってこのプロジェクトを支援する 💖 + +### スペシャル・スポンサー + +

+ +
+ オープンソースへ貢献して報酬を得よう +
+

+ +### GitHub + +

+ + + +

+ +### Open Collective + + + + + + + +[![image](https://github.com/user-attachments/assets/b9c5a918-70fc-4615-ae7d-e7e5bc3c66e8)](https://www.sanity.io/) + +## 使用者 + +Husky は、 GitHub の[**150万以上のプロジェクト**](https://github.com/typicode/husky/network/dependents?package_id=UGFja2FnZS0xODQzNTgwNg%3D%3D)で使用されています: + +- [vercel/next.js](https://github.com/vercel/next.js) +- [vercel/hyper](https://github.com/vercel/hyper) +- [webpack/webpack](https://github.com/webpack/webpack) +- [angular/angular](https://github.com/angular/angular) +- [facebook/docusaurus](https://github.com/facebook/docusaurus) +- [microsoft/vscode](https://github.com/microsoft/vscode) +- [11ty/eleventy](https://github.com/11ty/eleventy) +- [stylelint/stylelint](https://github.com/stylelint/stylelint) +- [colinhacks/zod](https://github.com/colinhacks/zod) +- [rollup/rollup](https://github.com/rollup/rollup) +- [tinyhttp/tinyhttp](https://github.com/tinyhttp/tinyhttp) +- ... + +## 記事 + +- [Why husky has dropped conventional JS config](https://blog.typicode.com/posts/husky-git-hooks-javascript-config/) +- [Why husky doesn't autoinstall anymore](https://blog.typicode.com/posts/husky-git-hooks-autoinstall/) diff --git a/docs/jp/migrate-from-v4.md b/docs/jp/migrate-from-v4.md new file mode 100644 index 000000000..5c004bca2 --- /dev/null +++ b/docs/jp/migrate-from-v4.md @@ -0,0 +1,67 @@ +# v4からの移行 + +`npm` や `yarn` を使って `package.json` の scripts を呼び出していた場合、 +設定ファイルから対応するフックに**コマンドをコピーするだけ**です: + +Husky v4 + +```json +// package.json +{ + "hooks": { + "pre-commit": "npm test && npm run foo" // [!code hl] + } +} +``` + +Husky v9 + +```shell +# .husky/pre-commit +# 複数行にコマンドを記述できるようになったことに注意してください +npm test // [!code hl] +npm run foo // [!code hl] +``` + +ローカルにインストールされたバイナリを呼び出していた場合は、 +**パッケージマネージャー経由で実行する必要**があります: + +::: code-group + +```js [.huskyrc.json (v4)] +{ + "hooks": { + "pre-commit": "jest" + } +} +``` + +```shell [.husky/pre-commit (v9)] +jest +``` + +::: + +環境変数 `HUSKY_GIT_PARAMS` は、ネイティブのパラメータ `$1`、`$2` などで置き換えられるようになりました。 + +::: code-group + +```js [.huskyrc.json (v4)] +{ + "hooks": { + "commit-msg": "commitlint -E HUSKY_GIT_PARAMS" + } +} +``` + +```shell [.husky/commit-msg (v9)] +commitlint --edit $1 +``` + +::: + +その他の環境変数の変更: + +- `HUSKY_SKIP_HOOKS` は `HUSKY` に置き換えられました +- `HUSKY_SKIP_INSTALL` は `HUSKY` に置き換えられました +- `HUSKY_GIT_PARAMS` は削除されました。代わりに、 Git パラメータをスクリプトで直接使うようになりました。 (例: `$1`) \ No newline at end of file diff --git a/docs/jp/troubleshoot.md b/docs/jp/troubleshoot.md new file mode 100644 index 000000000..10032574c --- /dev/null +++ b/docs/jp/troubleshoot.md @@ -0,0 +1,41 @@ +# トラブルシュート + +## コマンドが見つかりません + +解決方法については、[方法](./how-to.md)を参照してください。 + +## フックが実行されない + +1. ファイル名が正しいか確認してください。例えば, `precommit` や `pre-commit.sh` は無効な名前です。有効なファイル名については、 Git フックの[ドキュメント](https://git-scm.com/docs/githooks)を参照してください +2. `git config core.hooksPath` を実行して、 `.husky/_` (または、カスタムフックディレクトリ) を指していることを確認してください +3. Git のバージョンが `2.9` 以上であることを確認してください + +## アンインストール後に `.git/hooks/` が動作しない + +`husky` のアンインストール後に、 `.git/hooks/` にあるフックが動作しない場合には、 `git config --unset core.hooksPath` を実行してください。 + +## Windows 上の Yarn + +Windows で Git Bash (標準入力が tty でない)を使って Yarn を実行すると、 Git フックが失敗することがあります。 Windows ユーザーの方は、この回避策を実行してください: + +1. `.husky/common.sh` を作成する: + +```shell +command_exists () { + command -v "$1" >/dev/null 2>&1 +} + +# Windows 10, Git Bash, Yarn のための回避策 +if command_exists winpty && test -t 1; then + exec < /dev/tty +fi +``` + +2. Yarn コマンドが実行されるソース: + +```shell +# .husky/pre-commit +. .husky/common.sh + +yarn ... +```