結局gitの設定て何してるの?

·
#npm#CLI#git#開発

Git設定の「不安」を解消するCLIツールを作った

はじめに:なぜ作ったか

Gitの初期設定、みんなチュートリアル通りにコピペしてるけど、**「結局何やってるの?」**って理解してる人、少ないと思う。

git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"

これ、どこに保存される?
間違えたらどうなる?
元に戻せる?

チュートリアルは「このコマンドを実行してください」とは教えてくれる。でも、なぜそうするのか何が起きているのかは教えてくれない。

その「不安」を、透明性で解消するツールを作った。


思いつきから始まった

ある日、ふと思いついた。

「Gitをダウンロードして設定するCLIツール、作れないかな?」

GPTに相談したら、こう返ってきた:

技術的には作れる
ただし「Gitをダウンロードする」部分はOS依存で設計が肝
価値は「Gitそのもの」より「初期設定の自動化」にある

なるほど。

「Gitを自前で配布するCLI」ではなく、**「Gitを使える状態に一瞬で持っていくCLI」**にすれば、筋が良くなる。


設計の核心:3つの「しない」

開発を進めるにあたって、3つの原則を決めた。

1. 勝手に実行しない

Gitがインストールされていなければ、インストールコマンドを表示するだけ

Git is not installed.

brew install git
or install Xcode Command Line Tools

勝手に sudo を叩いたりしない。
ユーザーに選択肢を与える。

2. 何が起きるか見せる

--dry-run モードで、実行前に確認できる。

git-init-simple config --dry-run

Would execute:
  git config --global user.name "a-lost-social-misfit"
  git config --global user.email "a.lost.social.misfit@gmail.com"
  git config --global init.defaultBranch main

ブラックボックスにしない。
コマンドがそのまま見える。

3. スコープを守る

開発中、自分自身でも色々なアイデアが浮かんだ:

  • 「プロジェクト一覧表示とかどう?」
  • 「GitHub連携は?」
  • 「SSH鍵生成は?」

でも、GPTとClaudeに相談すると、どちらも同じ答えを返してきた。

「それはスコープ外です」

最初は「便利な機能」を増やしたくなる。
でも、それをやると:

  1. スコープがぶれる - Git設定ツールじゃなくなる
  2. 既存ツールと競合 - 車輪の再発明
  3. メンテが大変になる - README が長くなる、バグが増える

結局、こう決めた:

このツールは「Git初期設定」だけ。
プロジェクト管理は ghq、GitHub連携は gh、SSH設定は ssh-keygen の仕事。

Do one thing and do it well.


技術選定:依存ゼロという選択

{
  "dependencies": {},
  "devDependencies": {
    "typescript": "^5.0.0"
  }
}

なぜ依存ゼロにこだわったか。

  • メンテナンスコストが低い
  • セキュリティリスクが低い
  • 「Node標準で何ができるか」の証明

実際、全部で300行で完結した:

core/exec.ts    - child_process (20行)
core/prompt.ts  - readline (15行)  
core/os.ts      - os (10行)
core/which.ts   - コマンド存在確認 (15行)

依存ゼロでも、ちゃんと作れる。


実装の試行錯誤

Ctrl+C をどう扱うか

最初は「丁寧なエラーメッセージ」を出そうとした。

try {
  const name = await ask("user.name: ");
  const email = await ask("user.email: ");
} catch (err) {
  console.log("Input cancelled. No changes made.");
  // バックアップ削除して...
  // クリーンアップして...
}

でも、やりすぎた。

Claudeとの議論を経て、最終的にはシンプルに:

  • Ctrl+C → 即終了
  • バックアップは作らない
  • エラーは素直に出す

過剰なエラーハンドリングは、かえって分かりにくい。
シンプルが一番。

バックアップのタイミング

当初の実装:Proceed? (y/n) の直後にバックアップ

問題点:
入力途中で Ctrl+C したら、無駄なバックアップが残る。

解決策:
入力完了後にバックアップ。

// 1. 入力を全部取得
const name = await ask("user.name: ");
const email = await ask("user.email: ");
const branch = await ask("init.defaultBranch (main): ") || "main";

// 2. ここでバックアップ(入力完了後)
backupConfig();

// 3. 設定変更
setUser(name, email);
setDefaultBranch(branch);

Ctrl+C で中断しても、バックアップは作られない。
クリーンな状態を保てる。


機能肥大化との戦い

開発中、魅力的な提案がたくさん出た。

  • 現在のプロジェクト一覧表示
  • GitHub SSH設定の自動化
  • エディタ設定の推奨
  • .gitignore テンプレート生成

全部、断った。

なぜか?

  1. スコープ外 - Git初期設定から逸脱
  2. 既存ツールで十分 - 車輪の再発明
  3. 複雑化する - READMEが長くなる

代わりに守ったもの:

  • 3コマンド原則 - config, doctor, restore だけ
  • README 1画面原則 - スクロールなしで読める
  • 1文で説明できる - 「Git の初期設定を可視化して最小限で行う CLI」

ディレクトリ構成:責務の明確化

git-init-simple/
├─ src/
│  ├─ core/          # Node標準ライブラリのラッパー
│  │  ├─ exec.ts     # コマンド実行
│  │  ├─ prompt.ts   # ユーザー入力
│  │  ├─ os.ts       # プラットフォーム検出
│  │  └─ which.ts    # コマンド存在確認
│  ├─ git/           # Gitドメインロジック
│  │  ├─ check.ts    # Git確認
│  │  ├─ install.ts  # インストールガイド
│  │  ├─ config.ts   # 設定操作
│  │  └─ backup.ts   # バックアップ/復元
│  └─ cli/           # コマンド実装
│     ├─ doctor.ts   # 診断コマンド
│     ├─ config.ts   # 設定コマンド
│     └─ restore.ts  # 復元コマンド
└─ README.md

なぜ core/ に分けたか?

再利用性より責務の明確化のため。

  • core/exec.ts を読めば → コマンド実行してるだけ
  • git/config.ts を読めば → git config 叩いてるだけ
  • cli/index.ts を読めば → 対話して順番に実行してるだけ

ファイル単位で何をしてるかが一目瞭然。

各ファイルは20-40行。
grep で追える。
読んで理解できる。


学んだこと

1. 過剰なハンドリングは害

エラーを丁寧に処理しすぎると、かえって分かりにくくなる。

素直にエラーを出す方が、Unix的で正しい。

2. READMEは思想を伝える場所

使い方だけじゃない。
なぜそう作ったかを書く。

「For Developers」セクション:

The `src/core/` modules are deliberately simple and dependency-free.
You can copy them into your own CLI projects.
No attribution required (MIT License).

これも思想の表現。

3. 「便利」より「透明」

このツールは、手動で打つより速くない。

でも、何が起きてるかは分かる。

それが価値。


npmパッケージとして

npm install -g git-init-simple
51 files, 43.6 kB unpacked

「51ファイルは多い?」と思ったけど、これは:

  • 12個の .js ファイル
  • 12個の .d.ts ファイル(型定義)
  • 12個の .js.map ファイル(ソースマップ)
  • 12個の .d.ts.map ファイル

TypeScriptサポート完璧で、43.6kB は十分小さい。

他の有名CLIツールと比較:

chalk:      ~30 files,  50 kB
commander:  ~40 files,  80 kB
inquirer:  ~200 files, 500 kB

git-init-simple: 51 files, 43.6 kB

全然問題ない。


使ってみてほしい

これからGitを使う人、まだ使ったことがない人へ:

Gitは「エンジニアのためのツール」だと思われがちだけど、そんなことない。
文章を書く人、デザインをする人、研究をする人、誰でも使える。

このツールは、その最初の一歩を「不安なく」踏み出すために作った。

# インストール
npm install -g git-init-simple

# まず診断
git-init-simple doctor

# dry-runで確認
git-init-simple config --dry-run

# 実行
git-init-simple config

コードを読みたい人へ:

  • 各ファイル 20-50行
  • Node標準ライブラリのみ
  • grep で追える
  • コピペOK(MIT License)

GitHub: https://github.com/a-lost-social-misfit/git-init-simple
npm: https://www.npmjs.com/package/git-init-simple


最後に

このツールは「便利ツール」じゃない。

「哲学のプロダクト」 だ。

  • 魔法を使わない
  • 隠さない
  • 複雑にしない
  • ターミナルから出ない
  • 依存を増やさない
  • スコープを守る

同じ思想の人に使ってほしい。

そして、このコードを見て、学んで、コピペしてほしい。

それが、このツールの本当の価値だから。


Built with: Node.js, TypeScript
Philosophy: Terminal-first, No magic, Nothing hidden
Author: a-lost-social-misfit
License: MIT