A lightweight git-native issue tracking tool
that uses custom refs(refs/issues/latest, refs/remote/$REMOTE/issues/latest) and an orphaned-working tree.
- Personal motivation:
I wanted issue tracking to be fully integrated into a Git repository while remaining lightweight and flexible. Most Git-native issue management tools require additional installation or embed issues into commits or Git notes, which makes searching and modifying them cumbersome. Instead, I wanted issues to exist as simple files so they could be searched, edited, and managed freely.
- Philosophy
- Design
- Install
- Usage
- Implementation Detail
- Related Projects
- Discussion
- To-Dos
- Contributions
Philosophy ▲
- run
git pad $COMMAND- most commands are just like git commands
init,clone,log,status,commit,push,fetch,merge,pull,remote
- some are for issue managing
new,list,show,comment,edit,search,remove
- No staginag area
commit=add+commit(in git)
- most commands are just like git commands
Design ▲
- Distributed
- No 3rd-party service needed -> No vendor lock-in
- To avoid conflicts between locally generated issue files, we used random filename base on local repository(Compared to using UUID, ULID, easy to remember).
- Issues are stored in the same repository
- No another independent repository(main point of git-native issue tracking tool)
- Issues reside in a seperate folder and have different isolated history
- Using custom ref, issue-ref would not be shown in
git branch - Using worktree, you can do whatever git commands in the linked worktree(eg. .git-pad/)
- Issues isolated from codes
- Using custom ref, issue-ref would not be shown in
- Issue file names are simple and readable
- Most hash or ULID, UUID are long and hard to read
- Intentionally choose to use sequence with repo ID(which is random 6 alphabets) (eg.
ABCDEF-000001)
- Issues, comments are markdown files
- Easy to create, modify
- You can add custom fields in addition to
title:,status:, etc.
- You can add custom fields in addition to
- Easy to search and custom advanced search is possible(using other tools of your choice)
- issues are just markdown files so you can go into the folder and use
grep,ag,rg, etc. if you need.
- issues are just markdown files so you can go into the folder and use
- Do issues need to be stored as git commits or notes, like git-bug, git-native-issue, or git-appraisal? I could not find any reason to support it.
- check the related discussion at HackersNews
- Easy to create, modify
- Commands are just like git
- most commands work like git(status/commit/push/fetch/merge) except for
- no staging area, so no add
- no push --force, push --force-with-lease
- intentionally no re-writing history
- most commands work like git(status/commit/push/fetch/merge) except for
- Minimal dependency
- in bash scripts
- No server-side setup required
- lightweight
- Freedom to customize
- You can use pre-commit, post-commit hooks.
- eg. Use AI API to polish issues
- You can use pre-commit, post-commit hooks.
Install ▲
- run the following in bash(or zsh)
git clone https://github.com/kwhkim/git-pad.git
cd git-pad
bash install.sh
Script above will add the line similar to the following to ~/.bashrc or ~/.zschrc depending on OS
## git-pad
PATH=$PATH:/home/user/git/git-pad;
export PATH;
source /home/user/git/git-pad/autocompletion.sh;
Delete them to uninstall.
Or you can use git-pad with doing the following,
git clone https://github.com/kwhkim/git-pad.git
cd git-pad
PATH=$PATH:$PWDextensions.worktreeConfig as false, there is some risk of trouble. So you'd better copy the original repository before trying this. I'd advise you to run migrate_worktree_config.sh first to set extensions.worktreeConfig as true and do some setting. This will be incorporated into git pad init in a later version
Usage ▲
# Quick-setup or run install.sh above
git clone https://github.com/kwhkim/git-pad.git
cd git-pad
PATH=$PATH:$PWD # replace $PWD with the directory name where git-pad, git-pad-utils live
# Current issues with project git-pad
git pad clone
git pad list
git pad show ECBFEC-0004
git pad show ECBFEC4
git pad show E<TAB> # if auto-completion is possible
# get to the project directory and test git-pad
cd $GIT_PROJECT_PATH
git pad init # or git pad clone if there is already remote
git pad list
git pad --open --sort-pri # open issues only, sorted by priority
# A
git pad show $ISSUE_ID
git pad comment $ISSUE_ID
git pad new # or git pad edit $ISSUE_ID
git pad edit $ISSUE_ID
git pad comment $ISSUE_ID
git pad status
git pad commit
git pad fetch
git pad merge
# When conflicts, git pad edit $ISSUE_ID
git pad push
git pad list
# goes to A
Implementation detail ▲
-
Git-Embedded Distributed Issues Management System
git-pad: dispatcher for commands likegit pad init,git pad new, etc.git-pad-utils: functions likegit_pad_initnew_filename.shgen_repo_id: random 6 alphabetsrepo_id_in_use $1: check if$1is used in any issue filenext_seq KSTEDF .md:KSTEDF-nnnn.md라는 파일 형식에서 가장 마지막nnnn다음new_filename .md:.md파일에서 새로운 파일 이름
-
GitHub-Issues
gh_list_download.sh: download github issue list- Forward time slice scan first, then Backward time slice scan.
gh_list_state.json- Stores the coverage of github issues updates
-
History
- Originally named
git-issue. But there is already another project namedgit-issue(see Related Projects), so it was renamed to git-pad. So the filename and functions are all renamed to pad(commit...).
- Originally named
Related Projects(as-of 2026.02.04) ▲
| Storage | |
|---|---|
git-native-issue |
git commits(empty) |
git-appraise |
git notes |
git-issue |
repo |
git-dit |
git commits(empty) |
git-bug |
custom ref |
BE |
file |
- git-native-issue
- seems being actively developed and tested
- Using timestamp to resolve conflicts and store issues in empty commits.
- Implemented in bash
- latest release(v1.3.3) : 2026.2.16
- Yona: Project Hosting SW
- Git/SVN + MariaDB
- latest release(1.16.0) : 2023.01.09
- git-appraise
- uses Git Notes, a built-in Git feature for attaching metadata to commits without modifying the commits themselves.
- Not easy to modify, search(use
git grep)
- Not easy to modify, search(use
- Implemented in Go, requires Go tools installed.
- latest release : 2021.04.23
- uses Git Notes, a built-in Git feature for attaching metadata to commits without modifying the commits themselves.
- BE(Bugs-Everywhere)
- issues dependent on a branch
- implemented in python
- latest release(1.1.1) : 2012.11.17
- git-issue
- independent repository
- implemented in bash
- latest commit : 4 months ago
- git-bug
- custom reference
- In VScode git-graph with remote branches on, the graph gets messy as the number of bugs increases(See the figure 1 below)
git gcorgit fsckgets slower
- latest release : 2025.05.19
- custom reference
- git-dit
- issues are represented by empty commits(No file changes)
- issue-commits using git's ref(
refs/dit) - latest release(0.4.0) : 2017.09.15
- git-track
- no git-native, local(cannot be shared using git)
- latest commit : 15 years ago
Discussion about git-native issue tracking tools ▲
- reddit/git
- reddit: Decentralized Issue Tracking
- reddit: What is your simple issue tracking system
- HackersNews: Show HN: Git-native-issue - issues stored as commits in refs/issues/
- StackOverflow: Is possible to store repository issues in the git repository?
- StackOverflow: Keeping track of To-Do and issues in Git
To-Dos ▲
-
auto-completion: enable<TAB>aftergit padorgit pad edit- MacOS's zsh is yet to be supported
-
Different Template for Issue types
- Current, only one
TEMPLATE.mdfor all issues- possibly,
git pad new --type=bugto specify the type and the template.
- possibly,
- Current, only one
-
github bridge
- Download github issue list from
$REPO_KEY(ingh_list_vars.sh) gh_list_vars.shgh_list_init.shgh_list_download.sh,gh_list_download_stopped.shgh_list_export.sh
- Download github issue list from
-
gitlab bridge
-
gitbucket bridge
-
add LICENSE
You can see the list of issues, todos in the git-embedded issues using git-pad.
Contributions ▲
Contributions are welcome. Fork the repo and send a PR.
