{"id":13631985,"url":"https://github.com/dspinellis/git-issue","last_synced_at":"2025-05-15T02:10:47.191Z","repository":{"id":3697975,"uuid":"50618223","full_name":"dspinellis/git-issue","owner":"dspinellis","description":"Git-based decentralized issue management","archived":false,"fork":false,"pushed_at":"2025-03-22T16:14:36.000Z","size":571,"stargazers_count":795,"open_issues_count":20,"forks_count":66,"subscribers_count":30,"default_branch":"master","last_synced_at":"2025-04-12T06:44:41.166Z","etag":null,"topics":["git","issue-management","issue-tracker"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dspinellis.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":"CITATION.cff","codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2016-01-28T22:22:41.000Z","updated_at":"2025-04-10T03:28:29.000Z","dependencies_parsed_at":"2024-01-22T01:09:32.499Z","dependency_job_id":"7d010494-2c41-4360-975f-bca9dc1e9170","html_url":"https://github.com/dspinellis/git-issue","commit_stats":{"total_commits":454,"total_committers":24,"mean_commits":"18.916666666666668","dds":0.5286343612334802,"last_synced_commit":"4d2bc4173bf803d74bf2ae54f892bd08754f1b48"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dspinellis%2Fgit-issue","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dspinellis%2Fgit-issue/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dspinellis%2Fgit-issue/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dspinellis%2Fgit-issue/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dspinellis","download_url":"https://codeload.github.com/dspinellis/git-issue/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254259387,"owners_count":22040821,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["git","issue-management","issue-tracker"],"created_at":"2024-08-01T22:02:47.224Z","updated_at":"2025-05-15T02:10:42.167Z","avatar_url":"https://github.com/dspinellis.png","language":"Shell","readme":"[![Build Status](https://travis-ci.org/eellak/gsoc2019-git-issue.svg?branch=gsoc-2019)](https://travis-ci.org/eellak/gsoc2019-git-issue)\n# git-issue\n\nThis is a minimalist decentralized issue management system based on Git,\noffering (optional) biderectional integration with GitHub and GitLab issue management.\nIt has the following advantages over other systems.\n\n* **No backend, no dependencies:**\n  You can install and use _git issue_ with a single shell command.\n  There's no need for a server or a database back-end, and the corresponding\n  problems and requirements for their administration.\n* **Decentralized asynchronous management:**\n  Anyone can add, comment, and edit issues without requiring online access\n  to a centralized server.\n  There's no need for online connectivity; you can pull and push issues\n  when you're online.\n* **Transparent text file format:**\n  Issues are stored as simple text files, which you can view, edit, share, and\n  backup with any tool you like.\n  There's no risk of losing access to your issues because a server has\n  failed.\n* **Git-based:**\n  Issues are changed and shared through Git.\n  This provides _git issue_ with a robust, efficient, portable,\n  and widely available infrastructure.\n  It allows you to reuse your Git credentials and infrastructure, allows\n  the efficient merging of work, and also provides a solid audit trail\n  regarding any changes.\n  You can even use Git and command-line tools directly to make sophisticated\n  changes to your issue database.\n\n## Installation\n\n### Administrator installation\nClone the repo and run `make install` with appropriate privileges.\n\n### Personal installation\nClone the repo and register a git alias to the `git-issue.sh` script:\n\n```\ngit config --global alias.issue '!'\"${REPO_PATH}/git-issue.sh\"\n```\n\nIf you are using a bash shell, you can also register the autocompletion\nby adding the following to your .bashrc.\n\n```\nsource ${REPO_PATH}/gi-completion.sh\n```\n\n### Backward compatibility with the gi command\nFor backward compatibility you can also use the original _gi_ command,\nby copying `gi.sh` to someplace in your path.\nIn this case you must register the git alias to use the auto completion feature.\nIf you have administrative access you can install it with\n`sudo install gi.sh /usr/local/bin/gi`.\nFor your personal use,\nassuming that the directory `~/bin` exists and is in your path,\nyou can install it with `install gi.sh ~/bin/gi`.\nYou can even put `gi` in your project's current directory and run it from there.\n\n### Portability and testing\nThe `git-issue.sh` script has been tested on:\n* Archlinux (20220101)\n* Debian GNU/Linux\n* FreeBSD\n* macOS\n* Cygwin.\nIf you're running *git issue* on another system,\nrun the `test.sh` script to verify\nits operation, and (please) update this file.\n\n### Requirements\n`git-issue` requires the *jq* and *curl* utilities.\nOS X users might also need GNU date, obtained by installing `homebrew` package coreutils.\nFor running the tests *shellcheck* is also required.\n\n## Use\nYou use _git issue_ with the following sub-commands.\n\n### Start an issue repository\n* `git issue clone`: Clone the specified remote repository.\n* `git issue init`: Create a new issues repository in the current directory.\n  The `-e` option uses an existing Git project repository.\n\n### Work with an issue\n* `git issue new`: Create a new open issue (with optional `-s` summary and -c \"provider user repo\" for github/gitlab export).\n* `git issue show`: Show specified issue (and its comments with `-c`).\n* `git issue comment`: Add an issue comment.\n* `git issue edit`: Edit the specified issue's (or comment's with -c) description\n* `git issue tag`: Add (or remove with `-r`) a tag.\n* `git issue milestone`: Specify (or remove with `-r`) the issue's milestone.\n* `git issue weight`: Specify (or remove with `-r`) the issue's weight.\n  The weight is a positive integer that serves as a measure of importance.\n* `git issue duedate`: Specify (or remove with `-r`) the issue's due date.\n  The command accepts all formats supported by the `date` utility.\n* `git issue timeestimate`: Specify (or remove with `-r`) a time estimate for this issue.\n  Time estimates can be given in a format accepted by `date`,\n  however bear in mind that it represents a time interval, not a date.\n* `git issue timespent`: Specify (or remove with `-r`) the time spent working on an issue so far.\n  Follows the same format outlined above.\n  If the `-a` option is given, the time interval will be added together with the existing one.\n* `git issue assign`: Assign (or remove `-r`) an issue to a person.\n  The person is specified with his/her email address.\n  The form `@name` or `name@` can be used as a shortcut, provided it\n  uniquely identifies an existing assignee or committer.\n  Note that if you plan to export the issue to a GitHub/GitLab repository, the assignee may be rejected if\n  it doesn't correspond to a valid username, or if you don't have the necessary permissions.\n* `git issue attach`: Attach (or remove with `-r`) a file to an issue.\n* `git issue watcher`: Add (or remove with `-r`) an issue watcher.\n* `git issue close`: Remove the `open` tag, add the closed tag\n### Show multiple issues\n* `git issue list`: List open issues (or all with `-a`).\n   An optional argument can show issues matching a tag or milestone.\n* `git issue list -l formatstring`: This will list issues in the specified format, given as an argument to `-l`.\n  The following escape sequences can be used:\n\n  * `%n` : newline\n  * `%i` : issue ID\n  * `%c` : creation date\n  * `%d` : due date\n  * `%e` : time estimate\n  * `%s` : time spent\n  * `%w` : weight\n  * `%M` : Milestone\n  * `%A` : Assignee(s)\n  * `%T` : Tags\n  * `%D` : Description(first line)\n\n  If the format string is one of: (`oneline`, `short` or `full`) it will interpreted as the corresponding preset.\n\n  Optionally, one of the above given with `-o` will order based on this field(reverse order with `-r`).\n\n### Work with multiple issues\n* `git issue filter-apply command`: Run `command` in every issue directory. The following environment variables will be set:\n  * `GI_SHA` : Sha of the current issue\n  * `GI_IMPORTS` : The imports directories for current issue(one on each line)\n  * `GI_AUTHOR` : Author of current issue\n  * `GI_DATE` : Creation date of current issue\n\n  The command can read, add/remove or edit any of the issue's attributes.\n  Some potentially useful scripts to be used with this command are in the scripts/ directory.\n  Remember to inspect the results (e.g. `gi git diff`) and commit them with `gi git commit -a`.\n\n### Synchronize with remote repositories\n* `git issue push`: Update remote Git repository with local changes.\n* `git issue pull`: Update local Git repository with remote changes.\n* `git issue import`: Import/update GitHub/GitLab issues from the specified project.\n  If the import involves more than a dozen of issues or if the repository\n  is private, set the environment variable `GH_CURL_AUTH` (GitHub) or `GL_CURL_AUTH` (GitLab) to the authentication token.\n  For example, run the following command: `export GH_CURL_AUTH=\"Authorization: token badf00ddead9bfee8f3c19afc3c97c6db55fcfde\"`\n  You can create the authorization token through\n  [GitHub settings](https://github.com/settings/tokens/new), with the `repo` and `delete_repo`(only for running the tests) permissions.\n  For GitLab: `export GL_CURL_AUTH=\"PRIVATE-TOKEN: JvHLsdnDmD7rjUXzT-Ea\"`. The `api` permission is required.\n  Use the [GitLab settings](https://gitlab.com/profile/personal_access_tokens) to create the token.\n  In case the repository is part of a GitLab group, specify repository as groupname/reponame.\n* `git issue create`: Create the issue in the provided GitHub repository.\n  With the `-e` option any escape sequences for the attributes present in the description, will be replaced as above.\n  This can be used to e.g. export an unsupported attribute to GitHub as text.\n* `git issue export`: Export modified issues for the specified project.\n  Only the issues that have been imported and modified (or created by `git issue create`) by `git-issue` will be exported.\n  With the `-e` option any escape sequences for the attributes present in the description, will be replaced as above.\n  This can be used to e.g. export an unsupported attribute to GitHub as text.\n* `git issue exportall`: Export all open issues in the database (`-a` to include closed ones) to GitHub/GitLab. Useful for cloning whole repositories.\n\n### Help and debug\n* `git issue help`: Display help information about git issue.\n* `git issue log`: Output a log of changes made\n* `git issue git`: Run the specified Git command on the issues repository.\n* `git issue dump`: Dump the whole database in json format to stdout.\n\nIssues and comments are specified through the SHA hash associated with the\nparent of the commit that opened them, which is specifically crafted for\nthat element and can be used to derive its date and author.\n\n## Internals\nAll data are stored under `.issues`, which should be placed under `.gitignore`,\nif it will coexist with another Git-based project.\nThe directory contains the following elements.\n* A `.git` directory contains the Git data associated with the issues.\n* A `config` file with configuration data.\n* An `imports` directory contains details about imported issues.\n  * The `sha` file under `import/\u003cprovider\u003e/\u003cuser\u003e/\u003crepo\u003e/\u003cnumber\u003e` contains the\n    _git-issue_ SHA corresponding to an imported GitHub _number_ issue.\n    Likewise for GitLab.\n  * The `sha` file under `import/\u003cprovider\u003e/\u003cuser\u003e/\u003crepo\u003e/\u003cnumber\u003e/comments/\u003cnumber\u003e`\n    contains the _git-issue_ comment SHA corresponding to an imported GitHub/GitLab\n    _number_ comment.\n  * The file `import/\u003cprovider\u003e/\u003cuser\u003e/\u003crepo\u003e/checkpoint` contains the SHA\n    of the last imported or updated issue.  This can be used for merging\n    future updates.\n* An `issues` directory contains the individual issues.\n* Each issue is stored in a directory named `issues/xx/xxxxxxx...`,\n    where the x's are the SHA of the issue's initial commit.\n* Each issue can have the following elements in its directory.\n  * A `description` file with a one-line summary and a description of the issue.\n  * A `duedate` file with the due date stored in ISO-8601 format.\n  * A `weight` file with the weight stored as a positive integer.\n  * A `timespent` and `timeestimate` file with the time estimate and time spent respectively, stored in seconds.\n  * A `comments` directory where comments are stored, each with the SHA of\n    a commit containing the text `gi comment mark`\n    _issue SHA_.\n  * An `attachments` directory where the issue's attachments are stored.\n  * A `tags` file containing the issue's tags, one in each line.\n  * A `milestone` file containing the issue's milestone name.\n  * A `watchers` file containing the emails of persons to be notified when the issue changes (one per line).\n  * An `assignee` file containing the email for the person assigned to the issue.\n* A `templates` directory with message templates.\n\n## Contributing\nContributions are welcomed through pull requests.\nBefore working on a new feature please look at open issues, and if no\ncorresponding issue is open, create one to claim priority over the task.\nContributions should pass tests and should be accompanied with a\ncorresponding test case and documentation update.\nNote that to avoid duplicating information, the subcommands, the used files,\nand usage examples, are automatically inserted into the script and its\ndocumentation from the `README.md` file using the `sync-docs.sh` command.\n\n## Video\nThe video of a presentation of *git issue* at [FOSDEM 2020](https://fosdem.org/2020/schedule/event/git_issue_management/) is available [for streaming](https://video.fosdem.org/2020/H.2215/git_issue_management.webm) or [download](https://video.fosdem.org/2020/H.2215/git_issue_management.mp4).\n\n## Example session\nYou can also view a video of the following session on [YouTube](https://youtu.be/mLOZGolLmW4).\n\n### Initialize issue repository\n\n```\n$ git issue init\nInitialized empty Issues repository in /home/dds/src/gi/.issues\n$ git issue new -s 'New issue entered from the command line'\nAdded issue e6a95c9\n```\n\n### Create a new issue (opens editor window)\n\n```\n$ git issue new\nAdded issue 7dfa5b7\n```\n\n### List open issues\n\n```\n$ git issue list\n7dfa5b7 An issue entered from the editor\ne6a95c9 New issue entered from the command line\n```\n\n### Add an issue comment (opens editor window)\n\n```\n$ git issue comment e6a95c9\nAdded comment 8c0d5b3\n```\n\n### Add a due date for the issue\n\n```\n$ git issue duedate \"next Tuesday\" e6a95c9\nAdded duedate 2019-08-13T00:00:00+03:00\n```\n\n### Keep track of time spent on the issue\n\n```\n$ git issue timespent \"2hours\" e6a95c9\nAdded timespent 7200\n```\n\n### Log additional time spent working on it\n\n```\n$ git issue timespent -a \"4 hours\" e6a95c9\nAdded timespent 21600\n```\n\n### Add tag to an issue\n\n```\n$ git issue tag e6a9 urgent\nAdded tag urgent\n```\n\n### Add two more tags\n\n```\n$ git issue tag e6a9 gui crash\nAdded tag gui\nAdded tag crash\n```\n\n### Remove a tag\n\n```\n$ git issue tag -r e6a9 urgent\nRemoved tag urgent\n```\n\n### Assign issue\n\n```\n$ git issue assign e6a9 joe@example.com\nAssigned to joe@example.com\n```\n\n### Add issue watcher\n\n```\n$ git issue watcher e6a9 jane@example.com\nAdded watcher jane@example.com\n```\n\n### List issues tagged as gui\n\n```\n$ git issue list gui\ne6a95c9 New issue entered from the command line\n```\n\n### Push issues repository to a server\n\n```\n$ git issue git remote add origin git@github.com:dspinellis/gi-example.git\n$ git issue git push -u origin master\nCounting objects: 60, done.\nCompressing objects: 100% (50/50), done.\nWriting objects: 100% (60/60), 5.35 KiB | 0 bytes/s, done.\nTotal 60 (delta 8), reused 0 (delta 0)\nTo git@github.com:dspinellis/gi-example.git\n * [new branch]      master -\u003e master\nBranch master set up to track remote branch master from origin.\n```\n\n### Clone issues repository from server\n\n```\n$ git issue clone git@github.com:dspinellis/gi-example.git my-issues\nCloning into '.issues'...\nremote: Counting objects: 60, done.\nremote: Compressing objects: 100% (42/42), done.\nremote: Total 60 (delta 8), reused 60 (delta 8), pack-reused 0\nReceiving objects: 100% (60/60), 5.35 KiB | 0 bytes/s, done.\nResolving deltas: 100% (8/8), done.\nChecking connectivity... done.\nCloned git@github.com:dspinellis/gi-example.git into my-issues\n```\n\n### List open issues\n\n```\n$ git issue list\n7dfa5b7 An issue entered from the editor\ne6a95c9 New issue entered from the command line\n```\n\n### Create new issue\n\n```\n$ git issue new -s 'Issue added on another host'\nAdded issue abc9adc\n```\n\n### Push changes to server\n\n```\n$ git issue push\nCounting objects: 7, done.\nCompressing objects: 100% (6/6), done.\nWriting objects: 100% (7/7), 767 bytes | 0 bytes/s, done.\nTotal 7 (delta 0), reused 0 (delta 0)\nTo git@github.com:dspinellis/gi-example.git\n   d6be890..740f9a0  master -\u003e master\n```\n\n### Show issue added on the other host\n\n```\n$ git issue show 7dfa5b7\nissue 7dfa5b7f4591ecaa8323716f229b84ad40f5275b\nAuthor: Diomidis Spinellis \u003cdds@aueb.gr\u003e\nDate:   Fri, 29 Jan 2016 01:03:24 +0200\nTags:   open\n\n    An issue entered from the editor\n\n    Here is a longer description.\n```\n\n### Show issue and comments\n\n```\n$ git issue show -c e6a95c9\nissue e6a95c91b31ded8fc229a41cc4bd7d281ce6e0f1\nAuthor: Diomidis Spinellis \u003cdds@aueb.gr\u003e\nDate:   Fri, 29 Jan 2016 01:03:20 +0200\nTags:   open urgent gui crash\nWatchers:       jane@example.com\nAssigned-to: joe@example.com\n\n    New issue entered from the command line\n\ncomment 8c0d5b3d77bf93b937cb11038b129f927d49e34a\nAuthor: Diomidis Spinellis \u003cdds@aueb.gr\u003e\nDate:   Fri, 29 Jan 2016 01:03:57 +0200\n\n    First comment regarding the issue.\n```\n\n### Pull in remote changes (on the original host)\n\n```\n$ git issue pull\nremote: Counting objects: 7, done.\nremote: Compressing objects: 100% (6/6), done.\nremote: Total 7 (delta 0), reused 7 (delta 0), pack-reused 0\nUnpacking objects: 100% (7/7), done.\nFrom github.com:dspinellis/gi-example\n   d6be890..740f9a0  master     -\u003e origin/master\nUpdating d6be890..740f9a0\nFast-forward\n issues/ab/c9adc61025a3cb73b0c67470b65cefc133a8d0/description | 1 +\n issues/ab/c9adc61025a3cb73b0c67470b65cefc133a8d0/tags        | 1 +\n 2 files changed, 2 insertions(+)\n create mode 100644 issues/ab/c9adc61025a3cb73b0c67470b65cefc133a8d0/description\n create mode 100644 issues/ab/c9adc61025a3cb73b0c67470b65cefc133a8d0/tags\n```\n\n### List open issues\n\n```\n$ git issue list\n7dfa5b7 An issue entered from the editor\nabc9adc Issue added on another host\ne6a95c9 New issue entered from the command line\n```\n\n### Import issues from GitHub\n\n```\n$ git issue import github dspinellis git-issue-test-issues # Import GitHub issues\nImported/updated issue #3 as 0a27c66\nImported/updated issue #2 as feb2a2c\nImported/updated issue #2 comment 416631296 as f7de92c\nImported/updated issue #2 comment 416631349 as 03acf84\nImported/updated issue #2 comment 417048301 as 0cd48ed\nImported/updated issue #2 comment 417049466 as 325a581\nImported/updated issue #1 as bbe144d\n$ git issue list\nfeb2a2c An open issue on GitHub with a description and comments\n0a27c66 An open issue on GitHub with assignees and tags\n$ git issue show 0a27c66\nissue 0a27c6633f492e42bb2a24e6ae458482a4690a55\nAuthor: dspinellis \u003cdspinellis@users.noreply.github.com\u003e\nDate:   Thu, 30 Aug 2018 20:59:59 +0000\nGitHub issue: #3 at vyrondrosos/git-issue-test-issues\nTags:   bug\n        duplicate\n        enhancement\n        good first issue\n        open\nAssigned-to:    dspinellis\n        louridas\n\n    An open issue on GitHub with assignees and tags\n\n    Description\n\nEdit History:\n* Thu, 30 Aug 2018 20:59:59 +0000 by dspinellis\n* \u003cdspinellis@users.noreply.github.com\u003e\n```\n\n### Export all issues to GitHub\n\n```\n$ git issue exportall github dspinellis git-issue-test-issues\nCreating issue 9179d38...\nCouldn't add assignee dspinellis. Skipping...\nCouldn't add assignee louridas. Skipping...\nCreating issue 3651dd3...\nCreating new Milestone ver3...\nCreating comment d72c68d0177b500a91ea37548e6594f84457fd5b...\nCreating comment 6966d4d718c80cf8635e9276d6f391de70c22f93...\nCreating comment 85293a6904d0fbd6238fbb2e1c36fc65af9ffc60...\nCreating comment aea83723c0414ff135afcfb5165d64f8a7ad687c...\n```\n\n### Make changes\n\n```\n$ git issue edit 9179d38\nOpening editor...\nEdited issue 9179d38\n$ git issue edit -c d72c6\nOpening editor...\nEdited comment d72c68d\n```\n\n### Export modified issues back to GitHub\n\n```\n$ git issue export github dspinellis git-issue-test-issues # Needs a token with the relevant permissions\nIssue b83d92872dc16440402516a5f4ce1b8cc6436344 not modified, skipping...\nComment a93764f32179e93493ceb0a7060efce1e980aff1 not modified, skipping...\nExporting issue 9179d381135273220301f175c03b101b3e9c703d as #15\nIssue 3651dd38e4e1d9dbce66649710324235c773fe78 not modified, skipping...\nUpdating comment d72c68d0177b500a91ea37548e6594f84457fd5b...\nComment 6966d4d718c80cf8635e9276d6f391de70c22f93 not modified, skipping...\nComment 85293a6904d0fbd6238fbb2e1c36fc65af9ffc60 not modified, skipping...\nComment aea83723c0414ff135afcfb5165d64f8a7ad687c not modified, skipping...\n```\n\n### Sub-command auto-completion\n\n```\n$ git issue [Tab]\nassign   clone    comment  git      init     log      pull     show     watcher\nattach   close    edit     help     list     new      push     tag\n```\n\n### Issue SHA auto-completion\n\n```\n$ git issue show [Tab]\n7dfa5b7 - An issue entered from the editor\ne6a95c9 - New issue entered from the command line\n```\n\n## Related work\n* [bug](https://github.com/driusan/bug), inspired by Bugs Everywhere, written in Go, supports git and hg\n* [Bugs Everywhere](http://www.bugseverywhere.org/), also written in Python, supports many version control backends and offers a web interface.\n* [deft](https://github.com/npryce/deft) developed in 2011 is based on\n  the same idea.\n  It requires Python and offers a GUI.\n* [Fossil](http://fossil-scm.org/) is a distributed version control software that also supports issue tracking and a wiki. It runs as a single executable.\n* [git-appraise](https://github.com/google/git-appraise) is a distributed\n  code review system for Git repos based again on Git.\n* [git-bug](https://github.com/MichaelMure/git-bug), again written in Go, is a distributed bug tracker embedded in git.\n* [GitHub cli](https://cli.github.com/manual/gh_issue), offers a subcommand for managing GitHub's issues.\n* [Perceval](https://github.com/chaoss/grimoirelab-perceval) can download issues from a variety of systems, including GitHub and GitLab.\n* [SD (Simple Defects)](https://syncwith.us/sd/), an (unmaintained) distributed bug tracking system based on a distributed database. It can import/export from/to foreign ticketing systems.\n\nMore historical references can be found in [this old LWN article on distributed bug tracking](https://lwn.net/Articles/281849/).\n","funding_links":[],"categories":["Shell","Git Powered Issue/Bug Tracking","Distributed computing projects"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdspinellis%2Fgit-issue","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdspinellis%2Fgit-issue","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdspinellis%2Fgit-issue/lists"}