Junio C Hamano <gitster@xxxxxxxxx> 于2021年5月26日周三 上午1:11写道: > > ZheNing Hu <adlternative@xxxxxxxxx> writes: > > > So I don't know if adding %(header) will cause duplication of functions. > > I do not think you can duplicate the feature of %(header) with > other existing placeholders. You may want to dump the headers of > series of commits so that you can find if there is any commit with > unusal header elements, but %(tree), %(parents), etc. would by > definition be the known ones, so any combination of them will not be > a substitute. > Well, "find if there is any commit with unusal header elements" is indeed one thing that may need to be done (not now). I tried to build "%(header)" yesterday and found some problems: 1. These atoms are too "flat": "tree", "parent", "numparent", "object"... they are all part of the header, why not use "%(header:tree)" like "%(contents:subject)" does? Similarly, why not use "%(author:name)" instead of "%(authorname)"... 2. Why is there no state machine to save the parsing state of an object? `parse_tag_buffer()`, `parse_commit_buffer()`, they only parse part of the content of the object. E.g. tag parsed "object", "type", "tag" and "taggerdate" in `parse_tag_buffer()`, but it did not save the starting position and length of the parsed fields, which caused `grab_person()`, `grab_date()` to parse the object again and again. I think this may be an optimization point. > But nobody is asking for it right now, and your cat-file --batch > does not need it right away. > Or we only provide the simplest "%(header)" and "%(header:size)" (it can be easily supported with "%(raw)"), leaving the other feature to the future. > What I wanted to say in the message you are responding to was *not* > that you would want to add %(header) for completeness right now. > But thinking beyond your immediate need (i.e. the "whole thing") and > imagining how various pieces, including the ones that do not exist > yet, would fit together, would help you to avoid designing the parts > you immediately need in a way you would regret in the future. As I said before, many atomic designs are not very regular. Our ultimate goal may be we can simultaneously support: "%(raw)" "%(raw:header)" "%(raw:header:tagger)" "%(raw:header:tagger:eamil)" "%(raw:header:taggereamil)" "%(header:taggereamil)" "%(header:tagger:eamil)" "%(taggereamil)" "%(tagger:eamil)" ... Each layer is a namespace. Of course, it may take a long distance to support this. Thank. -- ZheNing Hu