# git-pad 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. ## Table of Contents * Philosophy * Design * Install * Usage * Implementation Detail * Related Projects * Discussion * To-Dos * Contributions ## Philosophy [▲](#table-of-contents) * 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) ## Design [▲](#table-of-contents) * 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 * 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. * 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. * 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](https://news.ycombinator.com/item?id=47135581) * 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 * 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 ## Install [▲](#table-of-contents) * 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, ```bash git clone https://github.com/kwhkim/git-pad.git cd git-pad PATH=$PATH:$PWD ``` ⚠️ If you already have linked worktree and set `extensions.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 [▲](#table-of-contents) ```{bash} # 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 # 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 [▲](#table-of-contents) * Git-Embedded Distributed Issues Management System * `git-pad` : dispatcher for commands like `git pad init`, `git pad new`, etc. * `git-pad-utils` : functions like `git_pad_init` * `new_filename.sh` * `gen_repo_id` : random 6 alphabets * `repo_id_in_use $1` : check if `$1` is used in any issue file * `next_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 named `git-issue`(see Related Projects), so it was renamed to **git-pad**. So the filename and functions are all renamed to **pad**(commit `...`). ## Related Projects(as-of 2026.02.04) [▲](#table-of-contents) | | 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](https://github.com/remenoscodes/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](https://github.com/yona-projects/yona) * Git/SVN + MariaDB * latest release(1.16.0) : 2023.01.09 * [git-appraise](https://github.com/google/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`) * Implemented in Go, requires Go tools installed. * latest release : 2021.04.23 * [BE(Bugs-Everywhere)](https://github.com/aaiyer/bugseverywhere) * issues dependent on a branch * implemented in python * latest release(1.1.1) : 2012.11.17 * [git-issue](https://github.com/dspinellis/git-issue) * independent repository * implemented in bash * latest commit : 4 months ago * [git-bug](https://github.com/git-bug/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 gc` or `git fsck` gets slower * latest release : 2025.05.19 * [git-dit](https://github.com/git-dit/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](https://github.com/dhesse/Git-Track) * no git-native, local(cannot be shared using git) * latest commit : 15 years ago
VSCode Git-Graph
Figure 1: VScode git-graph gets messy
## Discussion about git-native issue tracking tools [▲](#table-of-contents) * [reddit/git](https://www.reddit.com/r/git/) * [reddit: Decentralized Issue Tracking](https://www.reddit.com/r/programming/comments/4od2ni/decentralized_issue_tracking/) * [reddit: What is your simple issue tracking system](https://www.reddit.com/r/git/comments/wg6mk6/what_is_your_simple_issue_tracking_system/) * [HackersNews: Show HN: Git-native-issue - issues stored as commits in refs/issues/](https://news.ycombinator.com/item?id=47135581) * [StackOverflow: Is possible to store repository issues in the git repository?](https://stackoverflow.com/questions/19938579/is-possible-to-store-repository-issues-in-the-git-repository) * [StackOverflow: Keeping track of To-Do and issues in Git](https://stackoverflow.com/questions/7060973/keeping-track-of-to-do-and-issues-in-git) ## To-Dos [▲](#table-of-contents) * ~~auto-completion~~ : enable `` after `git pad` or `git pad edit` * MacOS's zsh is yet to be supported * Different Template for Issue types * Current, only one `TEMPLATE.md` for all issues * possibly, `git pad new --type=bug` to specify the type and the template. * github bridge * Download github issue list from `$REPO_KEY`(in `gh_list_vars.sh`) * `gh_list_vars.sh` * `gh_list_init.sh` * `gh_list_download.sh`, `gh_list_download_stopped.sh` * `gh_list_export.sh` * gitlab bridge * gitbucket bridge * add LICENSE * You can see the list of issues, todos in the git-embedded issues using `git-pad`. ## Contributions [▲](#table-of-contents) Contributions are welcome. Fork the repo and send a PR.