Human-friendly, temporal & intent-driven wrapper around git log.
Git-When provides natural-language-style flags, fuzzy search, glob path filters, named presets, and structured exports (table, JSON, CSV, Markdown).
# Clone the repository
git clone https://github.com/aristide021/git-when-cli.git
cd git-when-cli
# Install dependencies
npm install # or yarn install
# Link the CLI (on macOS/Linux)
npm link # makes `git-when` globally availableOn Windows, use:
npm install -g .- fuse.js (>=7.1.0) — fuzzy matching on authors and commit messages
- minimatch (>=10.0.1) — glob pattern filtering for file paths
- jest (devDependency) — testing framework for unit & integration tests
• Dates passed to --when are interpreted in UTC by default (e.g. 2023-05-07 → 2023-05-07T00:00:00Z). If your local timezone is behind UTC, a shorter-than-expected time window may appear. Always use ISO (YYYY-MM-DD..YYYY-MM-DD) or natural ranges (today, last-week).
• Your shell may expand globs before Git-When sees them. Quote patterns (e.g. --path="src/**/*.js") to avoid unintended matches.
- Use
--limit <n>to stop after the first n commits. - Push filtering into Git:
--author,--grep, and--pathreduce data before JS processing. - Combine flags:
git-when --who Alice --limit 50 --format=jsonfor a quick API export.
- Default threshold: 0.4 (balanced between strict and lenient)
- Stricter matching: Use
--fuzzy-level=0.1to0.3for more precise results - Lenient matching: Use
--fuzzy-level=0.6to0.8to catch more variations - Exact matching: Use Git's native
--authorand--grepflags instead of--who/--what
- 0: Successful execution (even if no commits match).
- 1: An error occurred, such as invalid flags, invalid date ranges, malformed presets, or Git errors (e.g., not a Git repository).
{
"perf-q2": {
"when": "2025-02-01..2025-02-28",
"who": "Bob",
"what": "perf",
"fuzzyThreshold": 0.3
},
"alice-week": {
"when": "last-week",
"who": "Alice"
},
"strict-search": {
"who": "john",
"fuzzyThreshold": 0.1,
"format": "json"
}
}hash,author,date,message
"abc123","Alice","2025-02-01T12:00:00+00:00","Initial commit"
"def456","Bob","2025-02-15T15:30:00+00:00","Performance work"
git-when [preset] [options]- Preset: If the first argument matches a saved preset name, its filters load automatically.
- Options:
-w,--when <range>Date range (e.g.2023-01..2023-03,last-week,today)-a,--who <author>Fuzzy author name-k,--what <keyword>Fuzzy commit message keyword-p,--path <glob>Glob file path (e.g.src/**/*.js,*.md)-f,--format <type>Output format:table(default),json,csv,md--fuzzy-level <0.0-1.0>Fuzzy search threshold (default: 0.4, lower = more strict)-s,--save <name>Save current filters as preset<name>-n,--limit <number>Limit the number of commits fetched--list-presetsList saved preset names--delete-preset <name>Remove a saved preset--helpShow this help--versionShow version
You can start from presets.example.json—copy it to ~/.config/git-when/presets.json and edit your favorites.
# 1. One-off: filter by author and date range
git-when --who="Alice" --when="2023-01-01..2023-03-31"
# 2. Glob path filter
git-when --path="src/**/*.js"
# 3. Save and reuse a preset
git-when -a="Bob" -w="last-week" --save weekly-bob
# later
git-when weekly-bob --format=markdown
# 4. Export JSON
git-when --what="fix" -w="today" --format=json > fixes-today.json
# 5. Manage presets
git-when --list-presets
git-when --delete-preset weekly-bob
# 6. Fine-tune fuzzy search sensitivity
git-when --who="john" --fuzzy-level=0.2 # Stricter matching
git-when --who="john" --fuzzy-level=0.8 # More lenient matching
# 7. Batch Markdown output
git-when --when="last-week" --format=markdown --batch-size=50- Natural flags (
--when,--who,--what,--path) - Configurable fuzzy search on authors and commit messages via
fuse.jswith adjustable threshold - Glob file filtering via
minimatch - Named presets for saving and reusing common filters with validation
- Structured output: ASCII table, JSON, CSV, or Markdown
- Cross-platform: Node.js CLI (macOS, Linux, Windows)
git-when-cli/
├── bin/git-when # CLI entrypoint (shebang + dispatcher)
├── lib/
│ ├── index.js # main command parser
│ ├── gitClient.js # wraps `git log`
│ ├── filters.js # fuzzy & glob filters
│ ├── presets.js # load/save presets
│ ├── formatter.js # table/json/csv/md exporters
│ └── utils.js # date-range parsing
├── test/ # Jest unit & integration tests
├── package.json
├── README.md
└── presets.json # built-in default presets (empty)
Run all tests with:
npm testIntegration tests require git installed on your PATH.
| Scenario | Time (s) | Mem (MB) |
|---|---|---|
| Full history (no filter) | 3.2 | 14.5 |
| 2020-01..2021-01 (no limit) | 2.9 | 14.1 |
| --limit=50 k | 0.8 | 13.9 |
We provide a benchmark harness in bench/benchmark.sh to measure streaming performance against large repositories (e.g. VSCode).
Features:
- Clones the full VSCode repo into
bench/vscode(with full history) - Executes
git-whenwith varying--limitvalues and a sample--whendate range - Measures real time, user/sys CPU, and peak memory with
/usr/bin/time - Outputs NDJSON results to
bench/output_<limit>.ndjsonand stats tobench/stats_<limit>.txt
To run benchmarks:
chmod +x bench/benchmark.sh
./bench/benchmark.shAdjust LIMITS and DATE_RANGE inside the script to customize runs. The bench/vscode clone and output files are ignored via .gitignore and safe to delete when done.
- Fork the repo & clone
- Create a feature branch (
git checkout -b feat/my-feature) - Write code & tests
- Submit a pull request
MIT