git-zf

command module
v0.7.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 10, 2026 License: MIT Imports: 3 Imported by: 0

README

Git-ZF - Git Zen workFlow

Logo git-zf

Command line utility to manage git workflow, connect to issue trackers, and standardize commit messages through a TUI.

Getting Started

Prerequisites
Install from source
git clone https://github.com/piprim/git-zf.git
cd git-zf
make
sudo make install      # copies binary to $(git --exec-path)

On macOS with Homebrew Git the exec-path is user-writable; omit sudo.

Install via go install
go install github.com/piprim/git-zf@latest
sudo git-zf install    # copies binary to $(git --exec-path)

If git --exec-path is user-writable, omit sudo.

Verify
git zf version
Uninstall

git zf uninstall

Usage

Commit
$ git zf commit
Usage:
  git-zf commit [flags]

Flags:
  -a, --all             stage all tracked modified/deleted files before committing
      --allow-empty     allow a commit with no changes
      --amend           replace the tip of the current branch
      --author string   override commit author as "Name <email>"
  -h, --help            help for commit
  -n, --no-verify       bypass pre-commit and commit-msg hooks
  -s, --signoff         add Signed-off-by trailer to the commit message

If any commit flag is passed, the options page of the TUI form is skipped and the flags are used directly.

Issue
$ git zf issue
$ git zf issue start
$ git zf issue list
$ git zf issue close

issue start — start work on an issue: optionally fetch open issues from a tracker (Redmine), or enter an issue ID, title, and type manually. A properly named branch is created and checked out automatically. Branch state is tracked in .git/git-zf.db.

If a tracker is configured, issue start pre-selects fetching from the tracker; after picking an issue you can update its status to "In Progress" in one step.

issue list — list issues enriched with local branch data. When a tracker is configured it is the primary source; the local store is used as fallback.

Columns: Issue ID · [Project] · Title · Branch · Local Status · Tracker Status · Created. The Project column appears automatically when issues span more than one project. "∅" means the issue has no local branch yet; "N.A." means no tracker is configured.

issue list flags:

--status string   filter by status: open, closed, all (default: open)
--stdout          print table to stdout without TUI
--json            print JSON array to stdout

In the interactive TUI:

  • / — filter rows in real time (matches any column, case-insensitive); Enter to confirm, Esc to clear
  • tab — cycle status filter (Open → Closed → All)
  • p — open the project picker (↑/↓ or j/k to navigate, Enter to confirm, Esc to cancel)
  • q — quit

issue close — close an in-progress issue: pick from the list of in-progress branches (the currently checked-out branch is pre-selected), merge into the base branch, update the local store, and optionally update the tracker status and delete the local branch.

The close flow:

  1. A conflict dry-run is performed in a temporary git worktree — if conflicts are detected the command aborts without touching anything.
  2. Choose merge strategy: Squash (default, combines all commits into one) or Classic (--no-ff, preserves full history). For squash, the commit author is pre-filled from your git config identity.
  3. Confirm the merge. After a successful merge the branch is marked as merged in the local store and the issue is marked as closed.
  4. If a tracker is configured, a status picker lets you update the remote issue status (or skip).
  5. Optionally delete the local branch. Safe delete (-d) is used for classic merges; force delete (-D) for squash merges (squash does not preserve ancestry so git requires -D).
Branch
$ git zf branch new       # create a branch with manual input
$ git zf branch list      # list tracked branches
$ git zf branch merge     # merge a branch via TUI
$ git zf branch prune     # clean up stale DB records

branch new is the same flow as issue start but pre-selects manual input.

branch list flags:

--status string   filter by status: in_progress, merged, all (default: in_progress)
--stdout          print table to stdout without TUI
--json            print JSON array to stdout

branch prune flags:

--base string   base branch for merge detection (default: auto-detected)
--dry-run       show what would be pruned without executing
Config
$ git zf config show
$ git zf config init

config show — print the active config file path followed by the effective configuration as formatted JSON. The issue-tracker.token field is masked as *** so the output is safe to share or paste into issues.

Example output:

Config file: /home/user/.git-zf.json

{
  "commit-types": [...],
  ...
  "issue-tracker": {
    "type": "redmine",
    "url": "https://redmine.example.com",
    "token": "***"
  }
}

If no config file is found the header reads no config file found (built-in defaults apply).

config init — interactively write the default config file. The destination is chosen based on context:

  • Outside a git repo, no home config: the home path is selected automatically without a prompt.
  • Inside a git repo or a home config already exists: a TUI picker lets you choose between $HOME/.git-zf.json and <repo>/.git/.git-zf.json. The repo-level file lives inside .git/ so it is never committed and cannot leak secrets. It takes precedence over the home file when present.

If the target file already exists a confirmation prompt is shown before overwriting.

Completion

For Bash users, set up completion with these steps:

  1. Generate Completion Script
    git zf completion bash > ~/git-zf-completion.bash
  2. Install System-Wide (recommended)
    sudo mv ~/git-zf-completion.bash /etc/bash_completion.d/
  3. Or Install User-Only
    mkdir -p ~/.local/share/bash-completion/completions
    mv ~/git-zf-completion.bash ~/.local/share/bash-completion/completions/git-zf
    
  4. Reload Your Shell
    source ~/.bashrc

Take a look at the Cobra Shell-Specific Configuration for the other supported shells.

All commands
Usage:
  git-zf [command]

Available Commands:
  branch      Manage local branches
  commit      Record changes to the repository
  completion  Generate completion script
  config      Manage git-zf configuration
  help        Help about any command
  install     Install this tool to git-core as git-zf
  uninstall   uninstall this tool from git-core
  issue       Manage issues
  version     Print version information and quit

Flags:
  -d, --debug   debug mode, output debug info to debug.log
  -h, --help    help for git-zf

Configuration

Config file: .git-zf.json (JSON). Two locations are supported; the repo-level file takes precedence over the home file:

Location Path Notes
Home $HOME/.git-zf.json Applied everywhere
Repo <repo>/.git/.git-zf.json Inside .git/ — never committed, can contain secrets

Use git zf config init to create the file interactively, or git zf config show to inspect the currently active configuration.

The default configuration is embedded in config/default.json.

Commit types

Override the list of commit types shown in the type selector:

{
  "commit-types": [
    { "name": "feat",  "desc": "A new feature" },
    { "name": "fix",   "desc": "A bug fix" },
    { "name": "chore", "desc": "Build process or tooling changes" }
  ]
}
Commit message

Override the form fields and/or the message template:

{
  "commit-message": {
    "items": [
      { "name": "scope",   "desc": "Scope (users, db, poll…):", "form": "input" },
      { "name": "subject", "desc": "Concise description. Imperative, lower case, no final dot:", "form": "input", "required": true },
      { "name": "body",    "desc": "Motivation for the change:", "form": "multiline" },
      { "name": "footer",  "desc": "Breaking changes and referenced issues:", "form": "multiline" }
    ],
    "template": "{{.type}}{{with .scope}}({{.}}){{end}}: {{.subject}}{{with .body}}\n\n{{.}}{{end}}{{with .footer}}\n\n{{.}}{{end}}"
  }
}
Branch naming

Branch names follow the format {issue-id}@{type}@{slugified-title}@{short-uuid}, e.g.:

ABC-42@feat@add-oauth-login@550e8400

To override the base branch (default: auto-detected from origin/HEAD, then main, then master):

{
  "branch": {
    "base": "develop"
  }
}
Tracker integration

git zf issue start and issue list can fetch open issues assigned to you from a project tracker. Supported trackers: Redmine and GitHub.

Add an issue-tracker section to .git-zf.json:

Redmine

{
  "issue-tracker": {
    "type": "redmine",
    "url": "https://redmine.example.com",
    "token": "YOUR_API_KEY"
  }
}

GitHub (public or GitHub Enterprise)

{
  "issue-tracker": {
    "type": "github",
    "url": "https://api.github.com",
    "token": "ghp_yourPersonalAccessToken"
  }
}

For GitHub Enterprise, set url to your instance API root, e.g. https://github.example.com/api/v3/.

Key Description
type Tracker type: "redmine" or "github".
url Base URL of the tracker API. For GitHub use https://api.github.com.
token API key (Redmine) or personal access token with repo scope (GitHub).
projects Optional list of projects to show. Redmine: project slugs or numeric IDs. GitHub: "owner/repo" strings. When omitted all assigned issues are shown.

Filtering by project

Use projects to limit which repositories or Redmine projects appear in issue list:

{
  "issue-tracker": {
    "type": "github",
    "url": "https://api.github.com",
    "token": "ghp_...",
    "projects": ["myorg/backend", "myorg/frontend"]
  }
}

Note for UpdateIssueStatus via GitHub: because GitHub's update endpoint requires the owner/repo, exactly one entry must be present in projects when using issue close with a GitHub tracker.

When a tracker is configured:

  1. issue start asks whether to fetch issues from the tracker.
  2. If yes, open issues assigned to you are listed; type any key to filter the list, pick one and select a branch type.
  3. After the branch is created, a status picker shows the live list of statuses from the tracker; pick one or skip.
  4. If the tracker is unavailable or returns no issues, the flow falls back to manual input.
  5. issue close shows the same live status picker after merging, so you can move the issue to "Done", "Closed", or any other status in a single step.
Commit auto-fill from issue branch

When you run git zf commit on an issue branch (e.g. ABC-42@feat@add-oauth@550e8400), the issue ID is automatically pre-filled into the commit form — into scope if that field exists, otherwise footer, otherwise subject as a fallback. The pre-fill is a hint only; you can edit or clear it before confirming.

Documentation

The Go Gopher

There is no documentation for this package.

Directories

Path Synopsis
cmd
internal
pkg

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL