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 @@ + + +> 超高速でモダンなネイティブ 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 + +
+
+
+
+