{"id":35408365,"url":"https://github.com/andrew/git-pkgs","last_synced_at":"2026-01-21T16:29:07.595Z","repository":{"id":332405081,"uuid":"1126405238","full_name":"andrew/git-pkgs","owner":"andrew","description":"A git subcommand for analyzing package/dependency usage in git repositories over time","archived":false,"fork":false,"pushed_at":"2026-01-15T07:20:27.000Z","size":528,"stargazers_count":39,"open_issues_count":8,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-01-15T08:13:36.114Z","etag":null,"topics":["git","git-commands","package-management","packages"],"latest_commit_sha":null,"homepage":"https://rubygems.org/gems/git-pkgs","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/andrew.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","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},"funding":{"github":"andrew","ko_fi":"andrewnez","buy_me_a_coffee":"andrewnez"}},"created_at":"2026-01-01T21:01:18.000Z","updated_at":"2026-01-15T07:31:11.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/andrew/git-pkgs","commit_stats":null,"previous_names":["andrew/git-pkgs"],"tags_count":12,"template":false,"template_full_name":null,"purl":"pkg:github/andrew/git-pkgs","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andrew%2Fgit-pkgs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andrew%2Fgit-pkgs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andrew%2Fgit-pkgs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andrew%2Fgit-pkgs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/andrew","download_url":"https://codeload.github.com/andrew/git-pkgs/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andrew%2Fgit-pkgs/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28473974,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-15T22:27:41.514Z","status":"ssl_error","status_checked_at":"2026-01-15T21:54:47.910Z","response_time":62,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6: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":["git","git-commands","package-management","packages"],"created_at":"2026-01-02T13:21:53.112Z","updated_at":"2026-01-20T14:36:32.022Z","avatar_url":"https://github.com/andrew.png","language":"Ruby","funding_links":["https://github.com/sponsors/andrew","https://ko-fi.com/andrewnez","https://buymeacoffee.com/andrewnez"],"categories":[],"sub_categories":[],"readme":"# git-pkgs\n\nA git subcommand for tracking package dependencies across git history. Analyzes your repository to show when dependencies were added, modified, or removed, who made those changes, and why.\n\n[Installation](#installation) · [Quick start](#quick-start) · [Commands](#commands) · [Configuration](#configuration) · [Ruby API](#ruby-api) · [Contributing](#contributing)\n\n## Why this exists\n\nYour lockfile shows what dependencies you have, but it doesn't show how you got here, and `git log Gemfile.lock` is useless noise. git-pkgs indexes your dependency history into a queryable database so you can ask questions like: when did we add this? who added it? what changed between these two releases? has anyone touched this in the last year?\n\nFor best results, commit your lockfiles. Manifests show version ranges but lockfiles show what actually got installed, including transitive dependencies.\n\nIt works across many ecosystems (Gemfile, package.json, Dockerfile, GitHub Actions workflows) giving you one unified history instead of separate tools per ecosystem. The database lives in your `.git` directory where you can use it in CI to catch dependency changes in pull requests.\n\nThe core commands (`list`, `history`, `blame`, `diff`, `stale`, etc.) work entirely from your git history with no network access. Additional commands fetch external data: `vulns` checks [OSV](https://osv.dev) for known CVEs, while `outdated` and `licenses` query [ecosyste.ms](https://packages.ecosyste.ms/) for registry metadata. See [docs/enrichment.md](docs/enrichment.md) for details on external data.\n\n## Installation\n\n```bash\nbrew tap andrew/git-pkgs https://github.com/andrew/git-pkgs\nbrew install git-pkgs\n```\n\nOr with RubyGems:\n\n```bash\ngem install git-pkgs\n```\n\nOr using Docker:\n\n```bash\ndocker build -t git-pkgs .\ndocker run -it --rm -v $(pwd):/mnt git-pkgs \u003csubcommand\u003e\n```\n\n## Quick start\n\n```bash\ncd your-repo\ngit pkgs init           # analyze history (one-time, ~300 commits/sec)\ngit pkgs list           # show current dependencies\ngit pkgs stats          # see overview\ngit pkgs blame          # who added each dependency\ngit pkgs history        # all dependency changes over time\ngit pkgs history rails  # track a specific package\ngit pkgs why rails      # why was this added?\ngit pkgs diff --from=HEAD~10  # what changed recently?\ngit pkgs diff --from=main --to=feature  # compare branches\ngit pkgs vulns          # scan for known CVEs\ngit pkgs vulns blame    # who introduced each vulnerability\n```\n\n## Commands\n\n### Initialize the database\n\n```bash\ngit pkgs init\n```\n\nWalks through git history and builds a SQLite database of dependency changes, stored in `.git/pkgs.sqlite3`.\n\nOptions:\n- `--branch=NAME` - analyze a specific branch (default: default branch)\n- `--since=SHA` - start analysis from a specific commit\n- `--force` - rebuild the database from scratch\n- `--no-hooks` - skip installing git hooks (hooks are installed by default)\n\nExample output:\n```\nAnalyzing branch: main\nProcessing commit 5191/5191...\nDone!\nAnalyzed 5191 commits\nFound 2531 commits with dependency changes\nStored 28239 snapshots (every 50 changes)\nBlob cache: 3141 unique blobs, 2349 had cache hits\n```\n\n### Database info\n\n```bash\ngit pkgs info\n```\n\nShows database size and row counts:\n\n```\nDatabase Info\n========================================\n\nLocation: /path/to/repo/.git/pkgs.sqlite3\nSize: 8.3 MB\n\nRow Counts\n----------------------------------------\n  Branches                        1\n  Commits                      3988\n  Branch-Commits               3988\n  Manifests                       9\n  Dependency Changes           4732\n  Dependency Snapshots        28239\n  ----------------------------------\n  Total                       40957\n\nSnapshot Coverage\n----------------------------------------\n  Commits with dependency changes: 2531\n  Commits with snapshots: 127\n  Coverage: 2.0% (1 snapshot per ~50 changes)\n```\n\n### List dependencies\n\n```bash\ngit pkgs list\ngit pkgs list --commit=abc123\ngit pkgs list --ecosystem=rubygems\ngit pkgs list --manifest=Gemfile\ngit pkgs list --stateless           # parse manifests directly, no database needed\n```\n\nExample output:\n```\nGemfile (rubygems):\n  bootsnap \u003e= 0 [runtime]\n  bootstrap = 4.6.2 [runtime]\n  bugsnag \u003e= 0 [runtime]\n  rails = 8.0.1 [runtime]\n  sidekiq \u003e= 0 [runtime]\n  ...\n```\n\n### View dependency history\n\n```bash\ngit pkgs history                       # all dependency changes\ngit pkgs history rails                 # changes for a specific package\ngit pkgs history --author=alice        # filter by author\ngit pkgs history --since=2024-01-01    # changes after date\ngit pkgs history --ecosystem=rubygems  # filter by ecosystem\n```\n\nShows when packages were added, updated, or removed:\n\n```\nHistory for rails:\n\n2016-12-16 Added = 5.0.0.1\n  Commit: e323669 Hello World\n  Author: Andrew Nesbitt \u003candrew@example.com\u003e\n  Manifest: Gemfile\n\n2016-12-21 Updated = 5.0.0.1 -\u003e = 5.0.1\n  Commit: 0c70eee Update rails to 5.0.1\n  Author: Andrew Nesbitt \u003candrew@example.com\u003e\n  Manifest: Gemfile\n\n2024-11-21 Updated = 7.2.2 -\u003e = 8.0.0\n  Commit: 86a07f4 Upgrade to Rails 8\n  Author: Andrew Nesbitt \u003candrew@example.com\u003e\n  Manifest: Gemfile\n```\n\n### Blame\n\nShow who added each current dependency:\n\n```bash\ngit pkgs blame\ngit pkgs blame --ecosystem=rubygems\ngit pkgs praise  # alias for blame\n```\n\nExample output:\n```\nGemfile (rubygems):\n  bootsnap                        Andrew Nesbitt     2018-04-10  7da4369\n  bootstrap                       Andrew Nesbitt     2018-08-02  0b39dc0\n  bugsnag                         Andrew Nesbitt     2016-12-23  a87f1bf\n  factory_bot                     Lewis Buckley      2017-12-25  f6cceb0\n  faraday                         Andrew Nesbitt     2021-11-25  98de229\n  jwt                             Andrew Nesbitt     2018-09-10  a39f0ea\n  octokit                         Andrew Nesbitt     2016-12-16  e323669\n  omniauth-rails_csrf_protection  dependabot[bot]    2021-11-02  02474ab\n  rails                           Andrew Nesbitt     2016-12-16  e323669\n  sidekiq                         Mark Tareshawty    2018-02-19  29a1c70\n```\n\n### Show statistics\n\n```bash\ngit pkgs stats\ngit pkgs stats --by-author         # who added the most dependencies\ngit pkgs stats --ecosystem=npm     # filter by ecosystem\ngit pkgs stats --since=2024-01-01  # changes after date\ngit pkgs stats --until=2024-12-31  # changes before date\n```\n\nExample output:\n```\nDependency Statistics\n========================================\n\nBranch: main\nCommits analyzed: 3988\nCommits with changes: 2531\n\nCurrent Dependencies\n--------------------\nTotal: 250\n  rubygems: 232\n  actions: 14\n  docker: 4\n\nDependency Changes\n--------------------\nTotal changes: 4732\n  added: 391\n  modified: 4200\n  removed: 141\n\nMost Changed Dependencies\n-------------------------\n  rails (rubygems): 135 changes\n  pagy (rubygems): 116 changes\n  nokogiri (rubygems): 85 changes\n  puma (rubygems): 73 changes\n\nManifest Files\n--------------\n  Gemfile (rubygems): 294 changes\n  Gemfile.lock (rubygems): 4269 changes\n  .github/workflows/ci.yml (actions): 36 changes\n```\n\n### Explain why a dependency exists\n\n```bash\ngit pkgs why rails\n```\n\nThis shows the commit that added the dependency along with the author and message.\n\n### Dependency tree\n\n```bash\ngit pkgs tree\ngit pkgs tree --ecosystem=rubygems\n```\n\nThis shows dependencies grouped by type (runtime, development, etc).\n\n### Find stale dependencies\n\n```bash\ngit pkgs stale                  # list deps by how long since last touched\ngit pkgs stale --days=365       # only show deps untouched for a year\ngit pkgs stale --ecosystem=npm  # filter by ecosystem\n```\n\nShows dependencies sorted by how long since they were last changed in your repo. Useful for finding packages that may have been forgotten or need review.\n\n### Find outdated dependencies\n\n```bash\ngit pkgs outdated               # show packages with newer versions available\ngit pkgs outdated --major       # only major version updates\ngit pkgs outdated --minor       # minor and major updates (skip patch)\ngit pkgs outdated --stateless   # no database needed\n```\n\nChecks package registries (via [ecosyste.ms](https://packages.ecosyste.ms/)) to find dependencies with newer versions available. Major updates are shown in red, minor in yellow, patch in cyan.\n\n### Check licenses\n\n```bash\ngit pkgs licenses               # show license for each dependency\ngit pkgs licenses --permissive  # flag copyleft licenses\ngit pkgs licenses --allow=MIT,Apache-2.0  # explicit allow list\ngit pkgs licenses --group       # group output by license\ngit pkgs licenses --stateless   # no database needed\n```\n\nFetches license information from package registries. Exits with code 1 if violations are found, making it suitable for CI. See [docs/enrichment.md](docs/enrichment.md) for all options.\n\n### Vulnerability scanning\n\nScan dependencies for known CVEs using the [OSV database](https://osv.dev). Because git-pkgs tracks the full history of every dependency change, it provides context that static scanners can't: who introduced a vulnerability, when it was fixed, and how long you were exposed.\n\n```bash\ngit pkgs vulns                  # scan current dependencies\ngit pkgs vulns v1.0.0           # scan at a tag, branch, or commit\ngit pkgs vulns -s high          # only critical and high severity\ngit pkgs vulns -e npm           # filter by ecosystem\ngit pkgs vulns -f sarif         # output for GitHub code scanning\n```\n\nSubcommands for historical analysis:\n\n```bash\ngit pkgs vulns blame            # who introduced each vulnerability\ngit pkgs vulns blame --all-time # include fixed vulnerabilities\ngit pkgs vulns praise           # who fixed vulnerabilities\ngit pkgs vulns praise --summary # author leaderboard\ngit pkgs vulns exposure         # remediation metrics (CRA compliance)\ngit pkgs vulns diff main feature # compare vulnerability state between refs\ngit pkgs vulns log              # commits that introduced or fixed vulns\ngit pkgs vulns history lodash   # vulnerability timeline for a package\ngit pkgs vulns show CVE-2024-1234  # details about a specific CVE\n```\n\nOutput formats: `text` (default), `json`, and `sarif`. SARIF integrates with GitHub Advanced Security:\n\n```yaml\n- run: git pkgs vulns --stateless -f sarif \u003e results.sarif\n- uses: github/codeql-action/upload-sarif@v3\n  with:\n    sarif_file: results.sarif\n```\n\nVulnerability data is cached locally and refreshed automatically when stale (\u003e24h). Use `git pkgs vulns sync --refresh` to force an update. See [docs/vulns.md](docs/vulns.md) for full documentation.\n\n### Integrity verification\n\nShow SHA256 hashes from lockfiles. Modern lockfiles include checksums that verify package contents haven't been tampered with.\n\n```bash\ngit pkgs integrity              # show hashes for current dependencies\ngit pkgs integrity --drift      # detect same version with different hashes\ngit pkgs integrity -f json      # JSON output\ngit pkgs integrity --stateless  # no database needed\n```\n\nThe `--drift` flag scans your history for packages where the same version has different integrity hashes, which could indicate a supply chain issue.\n\n### SBOM export\n\nExport dependencies as a Software Bill of Materials in CycloneDX or SPDX format:\n\n```bash\ngit pkgs sbom                      # CycloneDX JSON (default)\ngit pkgs sbom --type spdx          # SPDX JSON\ngit pkgs sbom -f xml               # XML instead of JSON\ngit pkgs sbom --name my-project    # custom project name\ngit pkgs sbom --stateless          # no database needed\n```\n\nIncludes package URLs (purls), versions, and licenses (fetched from registries). Use `--skip-enrichment` to omit license lookups.\n\n### Diff between commits\n\n```bash\ngit pkgs diff --from=abc123 --to=def456\ngit pkgs diff --from=HEAD~10\ngit pkgs diff main..feature --stateless  # no database needed\n```\n\nThis shows added, removed, and modified packages with version info.\n\n### Show changes in a commit\n\n```bash\ngit pkgs show              # show dependency changes in HEAD\ngit pkgs show abc123       # specific commit\ngit pkgs show HEAD~5       # relative ref\ngit pkgs show --stateless  # no database needed\n```\n\nLike `git show` but for dependencies. Shows what was added, modified, or removed in a single commit.\n\n### Find where a package is declared\n\n```bash\ngit pkgs where rails           # find in manifest files\ngit pkgs where lodash -C 2     # show 2 lines of context\ngit pkgs where express --ecosystem=npm\n```\n\nShows which manifest files declare a package and the exact line:\n\n```\nGemfile:5:gem \"rails\", \"~\u003e 7.0\"\nGemfile.lock:142:    rails (7.0.8)\n```\n\nLike `grep` but scoped to manifest files that git-pkgs knows about.\n\n### List commits with dependency changes\n\n```bash\ngit pkgs log                  # recent commits with dependency changes\ngit pkgs log --author=alice   # filter by author\ngit pkgs log -n 50            # show more commits\n```\n\nLike `git log` but only shows commits that changed dependencies, with the changes listed under each commit.\n\n### Keep database updated\n\nAfter the initial analysis, the database updates automatically via git hooks installed during init. You can also update manually:\n\n```bash\ngit pkgs update\n```\n\nTo manage hooks separately:\n\n```bash\ngit pkgs hooks              # show hook status\ngit pkgs hooks --install    # install hooks\ngit pkgs hooks --uninstall  # remove hooks\n```\n\n### Upgrading\n\nAfter updating git-pkgs, you may need to rebuild the database if the schema has changed:\n\n```bash\ngit pkgs upgrade\n```\n\nThis is detected automatically and you'll see a message if an upgrade is needed.\n\n### Show database schema\n\n```bash\ngit pkgs schema                   # human-readable table format\ngit pkgs schema --format=sql      # CREATE TABLE statements\ngit pkgs schema --format=json     # JSON structure\ngit pkgs schema --format=markdown # markdown tables\n```\n\nUseful for understanding the [database structure](docs/schema.md) or generating documentation.\n\n### CI usage\n\nYou can run git-pkgs in CI to show dependency changes in pull requests. Use `--stateless` to skip database initialization for faster runs:\n\n```yaml\n# .github/workflows/deps.yml\nname: Dependencies\n\non: pull_request\n\njobs:\n  diff:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n        with:\n          fetch-depth: 0\n      - uses: ruby/setup-ruby@v1\n        with:\n          ruby-version: '3.3'\n      - run: gem install git-pkgs\n      - run: git pkgs diff --from=origin/${{ github.base_ref }} --to=HEAD --stateless\n```\n\n### Diff driver\n\nInstall a git textconv driver that shows semantic dependency changes instead of raw lockfile diffs:\n\n```bash\ngit pkgs diff-driver --install\n```\n\nNow `git diff` on lockfiles shows a sorted dependency list instead of raw lockfile changes:\n\n```diff\ndiff --git a/Gemfile.lock b/Gemfile.lock\n--- a/Gemfile.lock\n+++ b/Gemfile.lock\n@@ -1,3 +1,3 @@\n+kamal 1.0.0\n-puma 5.0.0\n+puma 6.0.0\n rails 7.0.0\n-sidekiq 6.0.0\n```\n\nUse `git diff --no-textconv` to see the raw lockfile diff. To remove: `git pkgs diff-driver --uninstall`\n\n### Shell completions\n\nEnable tab completion for commands:\n\n```bash\n# Bash: add to ~/.bashrc\neval \"$(git pkgs completions bash)\"\n\n# Zsh: add to ~/.zshrc\neval \"$(git pkgs completions zsh)\"\n\n# Or auto-install to standard completion directories\ngit pkgs completions install\n```\n\n## Configuration\n\ngit-pkgs respects [standard git configuration](https://git-scm.com/docs/git-config).\n\n**Colors** are enabled when writing to a terminal. Disable with `NO_COLOR=1`, `git config color.ui never`, or `git config color.pkgs never` for git-pkgs only.\n\n**Pager** follows git's precedence: `GIT_PAGER` env, `core.pager` config, `PAGER` env, then `less -FRSX`. Use `--no-pager` flag or `git config core.pager cat` to disable.\n\n**Ecosystem filtering** lets you limit which package ecosystems are tracked:\n\n```bash\ngit config --add pkgs.ecosystems rubygems\ngit config --add pkgs.ecosystems npm\ngit pkgs info --ecosystems  # show enabled/disabled ecosystems\n```\n\n**Ignored paths** let you skip directories or files from analysis:\n\n```bash\ngit config --add pkgs.ignoredDirs third_party\ngit config --add pkgs.ignoredFiles test/fixtures/package.json\n```\n\n**Environment variables:**\n\n- `GIT_DIR` - git directory location (standard git variable)\n- `GIT_PKGS_DB` - database path (default: `.git/pkgs.sqlite3`)\n\n## Performance\n\nBenchmarked on an M1 MacBook Pro analyzing [octobox](https://github.com/octobox/octobox) (5193 commits, 8 years of history): init takes about 5 seconds at roughly 1000 commits/sec, producing a 4.8 MB database. About half the commits (2439) had dependency changes.\n\nOptimizations:\n- Bulk inserts with transaction batching (500 commits per transaction)\n- Blob SHA caching (75% cache hit rate for repeated manifest content)\n- Deferred index creation during bulk load\n- Sparse snapshots (every 50 dependency-changing commits) for storage efficiency\n- SQLite WAL mode for write performance\n\n## Supported ecosystems\n\ngit-pkgs uses [ecosystems-bibliothecary](https://github.com/ecosyste-ms/bibliothecary) for parsing, supporting:\n\nActions, BentoML, Bower, Cargo, Carthage, Clojars, CocoaPods, Cog, Conan, Conda, CPAN, CRAN, Deno, Docker, Dub, DVC, Elm, Go, Hackage, Haxelib, Hex, Homebrew, Julia, LuaRocks, Maven, Meteor, MLflow, Nimble, Nix, npm, NuGet, Ollama, Packagist, Pub, PyPI, RubyGems, Shards, SwiftPM, Vcpkg\n\nSBOM formats (CycloneDX, SPDX) are not supported as they duplicate information from the actual lockfiles.\n\n## Ruby API\n\nFor embedding in other tools (like forges), git-pkgs provides a stateless parsing API that doesn't require initializing a database:\n\n```ruby\nrequire \"git/pkgs\"\n\n# Parse a single manifest file\nresult = Git::Pkgs.parse_file(\"Gemfile\", content)\n# =\u003e { platform: \"rubygems\", kind: \"manifest\", dependencies: [...] }\n\n# Parse multiple files at once\nresults = Git::Pkgs.parse_files({\n  \"Gemfile\" =\u003e gemfile_content,\n  \"package.json\" =\u003e package_json_content\n})\n\n# Diff two versions of a manifest\ndiff = Git::Pkgs.diff_file(\"Gemfile\", old_content, new_content)\n# =\u003e { path: \"Gemfile\", platform: \"rubygems\", added: [...], modified: [...], removed: [...] }\n```\n\nThe diff_file method returns modified dependencies with a `previous_requirement` field showing the old version.\n\nFor database queries, connect to an existing database and use the Sequel models directly:\n\n```ruby\nGit::Pkgs::Database.connect(repo_git_dir)\nGit::Pkgs::Models::DependencyChange.where(name: \"rails\").all\n```\n\n\n## Contributing\n\nBug reports, feature requests, and pull requests are welcome. If you're unsure about a change, open an issue first to discuss it.\n\nGood first contributions: adding tests, improving error messages, or supporting new manifest formats via [ecosystems-bibliothecary](https://github.com/ecosyste-ms/bibliothecary).\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) for setup instructions and architecture docs.\n\n## License\n\nAGPL-3.0\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandrew%2Fgit-pkgs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fandrew%2Fgit-pkgs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandrew%2Fgit-pkgs/lists"}