{"id":24058223,"url":"https://github.com/ctsrc/goodgit","last_synced_at":"2026-06-09T01:03:18.328Z","repository":{"id":249320437,"uuid":"831188902","full_name":"ctsrc/goodgit","owner":"ctsrc","description":"gg – clone repos and retrieve data about users and repos from GitHub API and Gitlab API","archived":false,"fork":false,"pushed_at":"2024-07-20T17:57:14.000Z","size":33,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-26T13:12:48.569Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"isc","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ctsrc.png","metadata":{"files":{"readme":"README.md","changelog":null,"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}},"created_at":"2024-07-19T21:59:31.000Z","updated_at":"2024-07-20T17:57:17.000Z","dependencies_parsed_at":"2024-07-20T02:44:06.621Z","dependency_job_id":"267b1dc7-e1a0-4820-b2ae-abc5bbb7547b","html_url":"https://github.com/ctsrc/goodgit","commit_stats":null,"previous_names":["ctsrc/goodgit"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ctsrc/goodgit","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ctsrc%2Fgoodgit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ctsrc%2Fgoodgit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ctsrc%2Fgoodgit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ctsrc%2Fgoodgit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ctsrc","download_url":"https://codeload.github.com/ctsrc/goodgit/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ctsrc%2Fgoodgit/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34086664,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-08T02:00:07.615Z","response_time":111,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":[],"created_at":"2025-01-09T05:56:26.734Z","updated_at":"2026-06-09T01:03:18.300Z","avatar_url":"https://github.com/ctsrc.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# `gg` – good git\n\n[![Crates.io](https://img.shields.io/crates/v/goodgit?style=flat-square)](https://crates.io/crates/goodgit)\n[![Crates.io](https://img.shields.io/crates/d/goodgit?style=flat-square)](https://crates.io/crates/goodgit)\n[![License](https://img.shields.io/badge/license-ISC-blue?style=flat-square)](LICENSE)\n[![GitHub stars](https://img.shields.io/github/stars/ctsrc/goodgit?style=social)](https://github.com/ctsrc/goodgit#start-of-content)\n\nWhy git good when you can good git?\n\n`gg` is a program that clones repos from GitHub and simultaneously retrieves and stores data about the repo,\nthe owner, and the other repos that the owner has, and more, from the GitHub API. Oh and it also works with Gitlab.\n\n## Developing on macOS\n\nRun jaeger Docker container with native OTLP ingestion\n\n```zsh\ndocker run -d -p16686:16686 -p4317:4317 -e COLLECTOR_OTLP_ENABLED=true jaegertracing/all-in-one:latest\n```\n\nRun the gg app\n\n```zsh\ncargo run -- https://github.com/ctsrc/repotools\n```\n\nView traces at http://localhost:16686/\n\n## Ancient history\n\n`gg` is the successor of one small pair of shell functions.\n\nWhile the functions were still in use, here is what they most recently looked like:\n\n```zsh\nfunc ghu () {\n  # TODO: More robust\n  user=\"$( echo \"$1\" | sed 's#^https://github.com/\\([^/]*\\)/.*#\\1#' )\"\n  ghudir=\"$HOME/src/github.com/$user\"\n  [[ -d \"$ghudir\" ]] || mkdir -p \"$ghudir\"\n  cd \"$ghudir\"\n}\n\nfunc gh () {\n  ghu \"$1\"\n  #url=\"$( echo \"$1\" | sed 's#^https://github.com/\\([^/]*\\)/\\([^/]*\\).*#git@github.com:\\1/\\2.git#' )\"\n  url=\"$( echo \"$1\" | sed 's#^https://github.com/\\([^/]*\\)/\\([^/]*\\).*#https://github.com/\\1/\\2.git#' )\"\n  echo \"$url\"\n  ts git clone --bare \"$url\"\n}\n```\n\nShell regexes were used, and then a bare clone was enqueued using task spooler.\n\u003chttps://www.freshports.org/sysutils/ts/\u003e\n\nIt was a humble beginning. It did the most important thing which was to schedule git clone.\nBut it did not retrieve additional info about the repo or the owner from API.\nNor did it support Gitlab URLs.\n\nIt was time for something better. It was time for `gg` – good git.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fctsrc%2Fgoodgit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fctsrc%2Fgoodgit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fctsrc%2Fgoodgit/lists"}