On Sun, Apr 09, 2023 at 02:51:34PM +0800, ZheNing Hu wrote: > > The right thing to do here if you wanted to get a listing of all blobs > > in your repository regardless of their reachability or whether they are > > loose or packed is: > > > > git cat-file --batch-check='%(objectname)' --batch-all-objects | > > git rev-list --objects --stdin --no-walk --filter='object:type=blob' > > > > This looks like a mistake. Try passing a tree oid to git rev-list: > > git rev-list --objects --stdin --no-walk --filter='object:type=blob' > <<< HEAD^{tree} > 27f9fa75c6d8cdae7834f38006b631522c6a5ac3 > 4860bebd32f8d3f34c2382f097ac50c0b972d3a0 .cirrus.yml > c592dda681fecfaa6bf64fb3f539eafaf4123ed8 .clang-format > f9d819623d832113014dd5d5366e8ee44ac9666a .editorconfig > b0044cf272fec9b987e99c600d6a95bc357261c3 .gitattributes > ... This is the expected behavior. The filter options are meant to support partial clones, and the behavior is really "filter things we'd traverse to". It is intentional that objects the caller directly asks for will always be included in the output. I certainly found that convention confusing, but I imagine it solves some problems with the lazy-fetch requests themselves. Regardless, that's how it works and it's not going to change anytime soon. :) For that reason, and just for general flexibility, I think you are mostly better off piping cat-file through an external filter program (and then back to cat-file to get more data on each object). -Peff