{"slug": "open-structured-metadata-for-git", "title": "Open, Structured Metadata for Git", "summary": "GitButler has released git-meta, an open specification and command-line tool for attaching structured metadata such as provenance, ownership, and review status to Git objects. The tool stores metadata locally in a fast index and exchanges it using standard Git push and fetch protocols on separate refs/meta/* refs, enabling teams to audit agent-generated commits and manage review threads without polluting their working tree.", "body_md": "### What wrote this code, and how?\n\nStamp the model, prompt hash, and transcript ref onto the commits an agent produces. Audit later without parsing messages.\n\n``` bash\n$ git meta set commit:HEAD agent:model claude-4.6\n$ git meta list:push branch:feat-checkout agent:chat \\\n    'new comment'\n```\n\n`git-meta`\n\nis an open specification and reference CLI\ntool for attaching\n**arbitrary, fine-grained metadata** to Git objects\n— provenance, ownership, reviews, attestations —\nstored locally for fast queries and exchanged using normal Git\ntransfer protocols and servers.\n\nYou can think of `git meta`\n\nas a more performant,\nscalable, flexible and collaborative `git notes`\n\n.\n\nAttach key/values to commits, branches, paths, change-ids, or the project itself — not just whole commits.\n\nAttach values of several types *(strings, lists, sets)* to\nnamespaced keys such as `agents:model`\n\n.\n\nMetadata is exchanged as commits on `refs/meta/*`\n\n. If\nyou can `git push`\n\n, you can share it.\n\ngit-meta is designed around Git's promisor remotes, meaning it can easily handle millions of metadata entries and get values on demand.\n\nMetadata wants its own lane — structured, queryable, independently mutable — without polluting your working tree.\n\nStamp the model, prompt hash, and transcript ref onto the commits an agent produces. Audit later without parsing messages.\n\n␃WPNCODE0␃\n\nKeep owners, reviewers, and policy hints against paths — as sets that merge across branches instead of a single file people fight over.\n\n``` bash\n$ git meta set:add path:src/billing owners '[\"ali\", \"jin\"]'\n$ git meta set:add path:src/billing reviewers mira\n```\n\nAttach review threads and approvals directly to commits or ranges. Independent of any single forge.\n\n``` bash\n$ git meta set commit:314e7f0 review:status approved\n$ git meta list:push commit:314e7f0 review:notes \\\n    \"lgtm; verify the retry backoff\"\n```\n\nRecord test runs, SBOMs, or signatures as first-class keys — many independent fields on the same commit, each mutable on its own schedule.\n\n``` bash\n$ git meta set commit:HEAD ci:status  passed\n$ git meta set commit:HEAD ci:run     gha-4912\n$ git meta set commit:HEAD sbom:sha   sha256:ab…\n```\n\nEvery change lands in a fast local index first. To share, git-meta\nserializes that index into commits on a\n`refs/meta/*`\n\nref and ships them with the same\n`git push`\n\nand `git fetch`\n\nyou already use\n— no new daemons, protocols, or new wire formats.\n\n`git fetch`\n\nThe reference implementation is a single Rust binary. Install with\n`cargo`\n\n, wire up a remote, set a value and push it\n— then watch a teammate pull it down with the same tool.\n\nBuilds with stable Rust. The crate is\n`git-meta-cli`\n\n; the installed command is\n`git meta`\n\n.\n\n``` bash\n$ cargo install git-meta-cli\n$ git meta --version\n```\n\nMetadata lives under its own ref namespace. Pin the\nrecommended remote in a `.git-meta`\n\nfile at the\nrepo root — the same repo as your code is fine —\nthen run `git meta setup`\n\nto wire it up and seed\n`refs/meta/main`\n\n.\n\n``` bash\n$ cd your-project\n$ printf 'url: git@github.com:you/proj.git\\n' > .git-meta\n$ git meta setup\n```\n\nSet a key on any target — `commit`\n\n,\n`branch`\n\n, `path`\n\n, or\n`project`\n\n— then push the metadata refs to\nthe remote.\n\n``` bash\n$ git meta set commit:HEAD review:status approved\n$ git meta push\n```\n\nOn a different machine, a collaborator clones the repo and\nruns `git meta setup`\n\n. The committed\n`.git-meta`\n\nfile from step 02 picks the remote for\nthem, fetches the metadata refs, and gets them ready to\ninspect the values you wrote.\n\n``` bash\n$ git clone git@github.com:you/proj.git && cd proj\n$ git meta setup\n$ git meta show HEAD\n```\n\nThe git-meta specification was developed and proposed by\n[GitButler](https://gitbutler.com) with inspiration and\nfeedback from several leading version control teams, to solve the\ngrowing Git metadata problem.\n[Contact us](mailto:scott@gitbutler.com) if you would\nlike to join this list of cool kids using it.\n\nBoth. The important part is the\n**exchange format** — the agreement needed\nfor different implementations to interoperate. A\n**reference implementation** lives alongside the\nspec so you can try the ideas end-to-end.\n\nNo. git-meta uses ordinary Git objects — trees, commits,\nand refs under `refs/meta/*`\n\n. Any Git server that\naccepts arbitrary refs can transport it.\n\n`git notes`\n\n?\n`git notes`\n\nattaches a single blob per commit.\ngit-meta models many small, independently mutable fields\nagainst many kinds of targets (paths, branches, change-ids),\nwith typed values and deterministic merges.\n\nThree to start: `string`\n\n, `list`\n\n, and\n`set`\n\n. Each has a documented merge behavior so\nconcurrent edits resolve without custom code.\n\nMetadata lives on its own `refs/meta/*`\n\nrefs, so\ncloning code doesn't pull metadata unless you ask for it.\nInitialization uses partial fetches to only get a working set\nof data, not every historical value, but older values can be\nfetched on demand with any modern Git server, including\nGitHub.\n\nIf that's not enough, history can even be split and unioned in special cases, or even partially made private.\n\nYes — that's one of the motivating use cases. Stamp model, prompt data, and transcript references onto commits or branches, and query them later without parsing commit messages.\n\ngit-meta is small and sharp. The fastest way to make it better is to use it for something real.", "url": "https://wpnews.pro/news/open-structured-metadata-for-git", "canonical_source": "https://git-meta.com/", "published_at": "2026-05-27 21:16:56+00:00", "updated_at": "2026-05-27 21:44:44.052797+00:00", "lang": "en", "topics": ["ai-tools", "ai-infrastructure", "ai-agents", "mlops"], "entities": ["git-meta", "Git", "Claude"], "alternates": {"html": "https://wpnews.pro/news/open-structured-metadata-for-git", "markdown": "https://wpnews.pro/news/open-structured-metadata-for-git.md", "text": "https://wpnews.pro/news/open-structured-metadata-for-git.txt", "jsonld": "https://wpnews.pro/news/open-structured-metadata-for-git.jsonld"}}