Your comments here and also the comments on PersonIdent's in CommitCommand make me think that it is maybe not so good to really allow multiple invocations of call() on a command. Some options (e.g. PersonIdents) don't make sense to be reused multiple times. Also coding wise it makes it complicated. If you set a field to it's default value during the first invocation, how to determine whether the field was ever set explicitly during the second invocation to call(). 

Another problem are return values. If we dissallow multiple invocations on one instance we can more easily. Imagine RevWalks: I can easily write a command which has one RevWalk as field and which call() method returns this field. But this is not possible anymore if we have multiple invocations and for the first invocation you are still walking through the results and for the second invocation you start adding options (which will try to modify the RevWalk already passed to the caller).

If we want to be able to reuse a preconfigured command object for multiple command invocations we (which I guess happens seldomly) we could even just provide a clone() method which allows to create a copy of your template command before you call call(). 

My next proposal will tell at least in the javadoc not to call call() twice.

The specific problem on which you comment here is solved. Have only one revwalk instance which I'll populate during the add(), not() ,... methods and which I will directly return in this method.