結局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に相談すると、どちらも同じ答えを返してきた。
「それはスコープ外です」
最初は「便利な機能」を増やしたくなる。
でも、それをやると:
- スコープがぶれる - Git設定ツールじゃなくなる
- 既存ツールと競合 - 車輪の再発明
- メンテが大変になる - 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 テンプレート生成
全部、断った。
なぜか?
- スコープ外 - Git初期設定から逸脱
- 既存ツールで十分 - 車輪の再発明
- 複雑化する - 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