While playing with cg-ls, I tried: % cg-ls ... snip ... 100644 blob bc607fd55f6ce4e56ce87766369b5d4d55ec79af object.h 100755 blob f35877a6aa5b68d2fb4a388dcfa9b3e64262604e parent-id 040000 tree bfb75011c32589b282dd9c86621dadb0f0bb3866 ppc 100644 blob d922305ee0f5583bdfcb629f6d4061e11e0fa859 read-cache.c 100644 blob 1ad7ffc555b635fe57fa7834b12d71ff576be065 read-tree.c ... snip ... % cg-ls bfb75011c32589b282dd9c86621dadb0f0bb3866 <-- the ppc tree ID Invalid id: bfb75011c32589b282dd9c86621dadb0f0bb3866 usage: cat-file [-t | tagname] usage: cat-file [-t | tagname] Invalid id: Shouldn't cg-ls give a listing of a sub-tree? The cg-help says it takes a TREE-ID? The problem seems to be that tree-id really only accepts a commit-id and returns the TREE-ID of that commit. So I modified commit-id, tree-id and parent-id to make them more similar in coding style, force "short-id" names to be at least 4 lower case letters, and have tree-id accept short, unambiguous ID's and bare SHA1-ID's. Patch attached.