>From James Ramsay, Thu 12 Mar 2020 at 14:57:24 (+1100) : > 6. Elijah: replace refs helps, but not supported by hosts like GitHub etc > a. Stolee: breaks commit graph because of generation numbers. > b. Replace refs for blobs, then special packfile, there were edge cases. I am interested in more details on how to handle this using replace. My situation: coworkers push big files by mistake, I don't want to rewrite history because they are not too well versed with git, but I want to keep *my* repo clean. Partial solution: - identify the large blobs (easy) - write a replace ref (easy): $ git replace b5f74037bb91 $(git hash-object -w -t blob /dev/null) and replace the file (if it is still in the repo) by an empty file. Now the pain points start: - first the index does not handle replace (I think), so the replaced file appear as changed in git status, even through eg git diff shows nothing. => Solution: configure .git/info/sparse-checkout - secondly, I want to remove the large blob from my repo. Ideally I'd like to repack everything but filter this blob, except that repack does not understand --filter. So I need to use `git pack-objects` directly and then do the naming and clean up that repack usually does manually, which is error prone. Furthermore, while `git pack-objects` accepts --filter, I can only filter on blob size, not blob oid. (there is filter=sparse:oid where I could reuse my sparse checkout file, but I would need to make a blob of it first). And if I have one large file I want to keep, I cannot filter by blob size. Another solution would be to use `git unpack-objects` to unpack all objects (except I would need to do that in an empty git dir), remove the blob, and then repack everything. Am I missing a simpler solution? - finally, checkouting to a ref including the replaced (now missing) blob gives error messages of the form: error: invalid object 100644 b5f74037bb91c45606b233b0ad6aad86f8e3875e for 'Silverman-Height-NonTorsion.pdf' On the one hand it is reassuring that git checks that the real object (rather than only the replaced object) is still there, on the other hand it would be nice to ask git to completely forget about the original object (except fsck of course). Thanks, Damien