{"id":35214671,"url":"https://github.com/timonburkard/git-issue","last_synced_at":"2026-01-21T00:02:43.208Z","repository":{"id":330179942,"uuid":"1120567067","full_name":"timonburkard/git-issue","owner":"timonburkard","description":"A Git-native, file-backed issue tracker","archived":false,"fork":false,"pushed_at":"2026-01-14T23:30:57.000Z","size":628,"stargazers_count":5,"open_issues_count":6,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-01-16T16:47:45.836Z","etag":null,"topics":["cicd","cli","git","issue","issue-tracker","rust","tracker"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/timonburkard.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-12-21T13:48:04.000Z","updated_at":"2026-01-16T14:12:08.000Z","dependencies_parsed_at":"2026-01-11T21:25:41.981Z","dependency_job_id":null,"html_url":"https://github.com/timonburkard/git-issue","commit_stats":null,"previous_names":["timonburkard/git-issue"],"tags_count":14,"template":false,"template_full_name":null,"purl":"pkg:github/timonburkard/git-issue","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/timonburkard%2Fgit-issue","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/timonburkard%2Fgit-issue/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/timonburkard%2Fgit-issue/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/timonburkard%2Fgit-issue/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/timonburkard","download_url":"https://codeload.github.com/timonburkard/git-issue/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/timonburkard%2Fgit-issue/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28490523,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-16T23:55:29.509Z","status":"ssl_error","status_checked_at":"2026-01-16T23:55:29.108Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cicd","cli","git","issue","issue-tracker","rust","tracker"],"created_at":"2025-12-29T21:22:32.003Z","updated_at":"2026-01-17T00:43:31.926Z","avatar_url":"https://github.com/timonburkard.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# git-issue 🗂️\n\n[![CI/CD](https://github.com/timonburkard/git-issue/actions/workflows/pr.yml/badge.svg)](https://github.com/timonburkard/git-issue/actions)\n[![CI/CD](https://github.com/timonburkard/git-issue/actions/workflows/release.yml/badge.svg)](https://github.com/timonburkard/git-issue/actions)\n[![Crates.io](https://img.shields.io/crates/v/git-issue.svg)](https://crates.io/crates/git-issue)\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)\n\nA Git-native, file-backed issue tracker.\n\nIssues live alongside your code inside `.gitissues/`, making them platform-independent, version-controlled, branchable, mergeable, reviewable and offline-friendly.\n\n## 1.) Features\n\n- ✅ Git-native, file-backed issues under `.gitissues/`\n- ✅ Core commands: `init`, `new`, `list`, `show`, `set`, `edit`, `link`\n- ✅ Each issue has a markdown description incl. attachments\n- ✅ Each issue has metadata: `id`, `title`, `state`, `type`, `labels`, `reporter`, `assignee`, `priority`, `due_date`, `created`, `updated`\n- ✅ Each issue has `relationships`: Desired relationship categories (e.g, related, child/parent, ...) are configurable and bidirectional links can be managed automatically\n- ✅ Issues can be filtered and sorted\n- ✅ Issues can be bulk-edited incl. wildcard support based on filter list\n- ✅ Highly configurable: default columns for `list`, available options for `state` and `type`, relationship categories, commit message template, external editor, and more...\n- ✅ External editor renders issue information as markdown\n- ✅ Git-integration: auto-commit of changes\n- ✅ Possibility to export issue list into CSV file\n- ✅ Automated integration tests\n- 🚧 `search` command across all issue titles and descriptions\n- 🚧 Comments / discussions\n\n## 2.) Usage\n\n### 2.1) Installation\n\nDifferent installation approaches are explained here.\n\n#### 2.1.1) GitHub Release\n\nDownload the latest release from GitHub and put the binary on your PATH.\n\n1) Go to the Releases page and download the binary for your platform:\n   - `git-issue-linux-x86_64`\n   - `git-issue-macos-x86_64` or `git-issue-macos-aarch64`\n   - `git-issue-windows-x86_64.exe`\n2) Rename to the canonical name and place on your PATH\n   - Linux/macOS:\n     ```bash\n     mv git-issue-\u003cyour-platform\u003e git-issue\n     chmod +x git-issue\n     sudo mv git-issue /usr/local/bin/\n     ```\n   - Windows: rename `git-issue-windows-x86_64.exe` to `git-issue.exe` and move it to a directory on your PATH.\n3) Verify:\n   ```bash\n   git issue -h\n   ```\n\n#### 2.1.2) Cargo\n\nInstallation with cargo works as follows:\n\n```\ncargo install --git https://github.com/timonburkard/git-issue\n```\n\n#### 2.1.3) Crates\n\nPackage is available on https://crates.io/crates/git-issue, so it can be installed as follows:\n\n```\ncargo install git-issue\n```\n\n### 2.2) How To\n\nLets imagine this is the structure of your git repo, for which you want to add issue tracking:\n\n```\n.git/\nsrc/\nREADME.md\n.gitignore\n```\n\nIn the root of your repo, run:\n\n```bash\ngit issue init\n```\n\nThis will automatically create the `.gitissues/` directory in your git repo:\n\n```\n.git/\n.gitissues/\nsrc/\nREADME.md\n.gitignore\n```\n\nFor infos about the `.gitissues/` directory structure, see chapter [4.) Storage Layout](#4-storage-layout).\n\n#### 2.2.1) Gitignore\n\nThis is the suggested content for the `.gitignore`:\n\n```\n.gitissues/.tmp/\n.gitissues/exports/\n.gitissues/settings.yaml\n```\n\n### 2.3) Commands\n\n```bash\n# Help page\ngit issue -h\n\n# Version\ngit issue -V\ngit issue --version\n\n# Initialize tracking in your repo\ngit issue init\ngit issue init --no-commit\n\n# Create a new issue\ngit issue new 'Login redirection problem'\ngit issue new 'Login redirection problem' --type bug --labels software,ui --reporter alice --assignee bob --priority P1 --due-date 2026-02-15\ngit issue new 'Login redirection problem' --reporter me --assignee me  # 'me' is automatically replaced with `settings.yaml:user`\n\n# List issues\ngit issue list\ngit issue list --columns id,assignee,title\ngit issue list --columns '*'\n\ngit issue list --filter priority=P2 title='*driver*' assignee='' description='*hardware*'  # Equal operator with support for wildcard and empty\ngit issue list --filter due_date\\\u003e2025-05-31 due_date\\\u003c2026-01-01  # Range operator\ngit issue list --filter state=new,active                           # Equal operator with OR: All issues with state 'new' OR 'active' are shown\ngit issue list --filter labels=ui labels=cli                       # Equal operator with AND: Only issues with both labels 'ui' AND 'cli' are shown\n\ngit issue list --sort assignee=asc priority=desc\n\ngit issue list --no-color  # disable colored output\n\ngit issue list --csv  # export issue list into CSV file (.gitissues/exports/)\n\n# Show all issue information (markdown) -- launches external text editor\ngit issue show 1234\n\n# Change issue meta fields\ngit issue set 1234 --title 'LCD driver has a problem'\ngit issue set 1234 --state resolved --type bug --reporter alice --assignee bob --priority P1 --due-date 2026-01-31\ngit issue set 1234 --reporter me --assignee me  # 'me' is automatically replaced with `settings.yaml:user`\n\n# Change issue meta fields: labels\ngit issue set 1234 --labels cli,driver         # set labels (overwrite)\ngit issue set 1234 --labels-add cli,driver     # add labels\ngit issue set 1234 --labels-remove cli,driver  # remove labels\n\n# Change issue meta fields: bulk action for multiple IDs\ngit issue set 1234,5678 --assignee alice\n\n# Change issue meta fields: bulk action for all issues shown in the last `list` command\ngit issue list --filter state=new labels=gui\ngit issue set '*' --assignee alice\n\n# Change issue relationships\ngit issue link 1234 --add related=5678                                       # add relationship link\ngit issue link 1234 --remove related=5678                                    # remove relationship links\ngit issue link 1234 --add related=5678,3333 parent=9999 --remove child=7777  # batch update relationship links\n\n# Edit issue description (markdown) -- launches external text editor\ngit issue edit 1234\n```\n\n### 2.4) Example\n\nExample projects to see how `git-issue` is used in a repo:\n\n- Dummy: [Example Project](https://github.com/timonburkard/example-project)\n- Real: The current repo\n\n## 3.) Configuration\n\nAfter running `git issue init`, the following default files are automatically created:\n\n - `.gitissues/config.yaml`:    Project configuration file (should be version-controlled)\n - `.gitissues/settings.yaml`:  Local user settings file (should **not** be version-controlled)\n - `.gitissues/users.yaml`:     Users (should be version-controlled)\n - `.gitissues/description.md`: Issue description template (should be version-controlled)\n\nThese files can be edited by the user.\n\n### 3.1) config.yaml\n\nThis file holds the project configuration. It should be version-controlled.\n\n```yaml\n# YAML schema version: Don't change manually!\n_version: 1\n\n# Automatically create a git commit after mutating commands\ncommit_auto: true\n\n# Commit message template\n# Available placeholders: {action}, {id}, {title}\ncommit_message: '[issue] {action} #{id} -- {title}'\n\n# Default columns to display in `issue list`\n# ['*'] can be used to include all available columns\nlist_columns:\n  - id\n  - state\n  - assignee\n  - title\n\n# Available issue states\n# First state in the list is the initial state for new issues\nstates:\n  - new\n  - active\n  - closed\n  - deleted\n\n# Available issue types\n# Per default the type is empty for new issues\ntypes:\n  - bug\n  - feature\n  - task\n\n# Available relationships between issues\n# link: specifies the name of the reciprocal relationship\n#  - same name:      bidirectional, symmetric\n#  - different name: bidirectional, asymmetric\n#  - null:           unidirectional\nrelationships:\n  related:\n    link: related\n  parent:\n    link: child\n  child:\n    link: parent\n\n# Separator used when exporting to CSV\nexport_csv_separator: ','\n\n# ID generation strategy (always u32)\n# Options:\n#  - sequential: Sequential numbers (1, 2, 3, ...)\n#  - timestamp:  Timestamps in seconds since 2025-01-01\n#                (in teams this reduces the chance of merge conflicts)\nid_generation: sequential\n\n# Default priority for new issues\n# Options: '', P0, P1, P2, P3, P4\npriority_default: ''\n```\n\n#### 3.1.1) Options\n\n- `commit_auto` (boolean): If `true`, automatically commit changes to `.gitissues/`\n- `commit_message` (string): Template for git commit messages. Supports placeholders:\n  - `{id}`: Issue ID\n  - `{title}`: Issue title\n  - `{action}`: Command that triggered the commit (`new`, `edit description`, `set \u003cfields\u003e`, `links updated`)\n- `list_columns` (list of strings): Default columns shown in `list` command\n- `states` (list of strings): Available issue states. The default for new issues is the first element.\n- `types` (list of strings): Available issue types. The default for new issues is empty.\n- `relationships` (object): Available relationships between issues\n- `export_csv_separator` (char): Separator for CSV file exports\n- `id_generation` (string): ID generation strategy. Supports options:\n  - `sequential`: Sequential numbers (1, 2, 3, ...)\n  - `timestamp`: Timestamps in seconds since 2025-01-01 (in teams this reduces the chance of merge conflicts)\n- `priority_default`: (string): Default priority for new issues.\n\n### 3.2) users.yaml\n\nThis file holds the available users in the project. It should be version-controlled.\n\n```yaml\n# YAML schema version: Don't change manually!\n_version: 1\n\n# List of valid users\n# For new issues, per default the assignee is empty\n# For new issues, per default the reporter is `settings.yaml:user`\nusers:\n  - id: alice\n  - id: bob\n  - id: carol\n```\n\n### 3.3) settings.yaml\n\nThis file holds the local user settings. It should **not** be version-controlled.\n\nIt is automatically created when `git issue init` is executed or when it is missing.\n\n```yaml\n# YAML schema version: Don't change manually!\n_version: 1\n\n# Editor to edit/show issue descriptions\n# git = use the git-configured editor\neditor: git\n\n# User name\n# Used as default reporter for new issues\n# Must be in users.yaml:users:id or ''\nuser: alice\n\n# Formatting options for list command\n# User may change colors\n# User may add/remove keys under state, priority and type\nlist_formatting:\n  header_separator: true  # header row separator: dashed line\n  colors:\n    header: bold  # header row\n    me: bold  # when assignee or reporter matches the current user\n    due_date_overdue: bold  # when due_date \u003c current date\n    state:\n      new: red\n      active: yellow\n      closed: green\n    priority:\n      P0: red\n      P1: bright_red\n      P2: yellow\n      P3: bright_yellow\n      P4: green\n    type:\n      bug: red\n      feature: green\n      task: blue\n```\n\n#### 3.3.1) Options\n\n- `editor` (string): External text editor (set `git` to use configured git core.editor)\n- `user` (string): User name, used per default as reporter for new issues (can be '')\n- `list_formatting` (object):\n  - `header_separator` (bool): Whether or not to print a dashed line as header row separator\n  - `colors` (object): available colors: `bold`, `[bright_]white`, `[bright_]black`, `[bright_]red`, `[bright_]green`, `[bright_]yellow`, `[bright_]blue`, `[bright_]magenta`, `[bright_]cyan`\n    - `header` (string): color of header row\n    - `me` (string): color of assignee or reporter when it matches the current user\n    - `due_date_overdue` (string) color of due_date when it is overdue\n    - `state` (object): color of the states (user may add/remove states)\n    - `priority` (object): color of the priorities (user may add/remove states)\n    - `type` (object): color of the types (user may add/remove states)\n\n### 3.4) description.md\n\nThis file holds the template for the issue descriptions. It is use when a new issue is created with `git issue new`.\n\n```md\n# Description\n\n# Repro Steps\n\n# Expected Behavior\n\n# System Info\n\n```\n\n## 4.) Storage Layout\n\nThis is the directory structure of `.gitissues/`:\n\n```\n.gitissues/\n├── .tmp/           # Temporary files (put in `.gitignore`)\n├── config.yaml     # Project configuration\n├── description.md  # Description template\n├── users.yaml      # Available users\n├── settings.yaml   # Local user settings (put in `.gitignore`)\n├── exports/        # Location of CSV exports (put in `.gitignore`)\n└── issues/\n    └── 0000000001/\n        ├── meta.yaml       # Structured metadata\n        ├── description.md  # Markdown description\n        └── attachments/    # Attachments of markdown description\n    ├── 0000000002/\n        ├── meta.yaml       # Structured metadata\n        ├── description.md  # Markdown description\n        └── attachments/    # Attachments of markdown description\n    └── ...\n```\n\n### 4.1) meta.yaml Format\n\n```yaml\n_version: 1                    # YAML schema version\nid: 1234                       # (Integer) Identifier\ntitle: Login screen is broken  # (String) Title\nstate: new                     # (String) E.g.: new, active, resolved, junked\ntype: bug                      # (String) E.g.: feature, bug, task\nlabels:                        # (List of Strings) Labels / tags\n  - software\n  - ui\nreporter: t.burkard            # (String) Who reported the issue\nassignee: j.doe                # (String) To whom the issue is assigned\npriority: P2                   # (Enum) Priority: P0 = highest, P4 = lowest\ndue_date: 2026-01-31           # (Date) Due date in ISO format: YYYY-MM-DD\nrelationships:                 # (Object) Relationships with other issues\n  related:\n    - 5678\n    - 7777\n  parent:\n    - 5555\n  child:\n    - 3333\n    - 4444\ncreated: 2025-11-13T15:54:52Z  # (Timestamp) Issue was created at\nupdated: 2025-12-22T20:36:11Z  # (Timestamp) Issue was last updated at\n```\n\nDon't edit these files manually. Instead use the `git issue set` and `git issue link` commands.\n\n## 5.) Development\n\n### 5.1) Building \u0026 Testing\n\n```bash\n# Build\ncargo build\n\n# Format code\ncargo fmt\n\n# Lint\ncargo clippy\n\n# Run tests\ncargo test\n```\n\n### 5.2) Architecture\n\n- `config/`\n  - `config-default.yaml`    -- Default configuration, copy-pasted at `git issue init` to `.gitissues/`\n  - `description-default.md` -- Default description template, copy-pasted at `git issue init` to `.gitissues/`\n  - `users-default.yaml`     -- Default users, copy-pasted at `git issue init` to `.gitissues/`\n  - `settings-default.yaml`  -- Default local user settings, copy-pasted at `git issue init` to `.gitissues/`\n- `src/`\n  - `main.rs`  -- CLI parsing with clap\n  - `model.rs` -- Shared data types, functions and utilities\n  - `edit.rs`  -- Edit issue description (markdown) with external text editor\n  - `init.rs`  -- Initialize `.gitissues/` directory and copy default config\n  - `link.rs`  -- Change relationships between issues\n  - `list.rs`  -- List all issues\n  - `new.rs`   -- Create new issues\n  - `set.rs`   -- Change issue meta fields\n  - `show.rs`  -- Show all issue information (markdown) with external text editor\n- `tests/`     -- Automated tests\n\n### 5.3) Dependencies\n\n- `clap`        -- CLI argument parsing\n- `chrono`      -- Timestamp generation\n- `serde`       -- Serialization framework\n- `serde_yaml`  -- YAML parsing for meta.yaml files\n- `shell-words` -- Process command line according to parsing rules of Unix shell\n- `regex`       -- Regular expressions\n- `indexmap`    -- Provides IndexMap datatype\n- `anstyle`     -- Terminal output coloring\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftimonburkard%2Fgit-issue","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftimonburkard%2Fgit-issue","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftimonburkard%2Fgit-issue/lists"}