Throwing a GitAPIException from call() is easy. But what about our Setter- and Getter- Methods? Fail-fast strategy would ideally throw exceptions on every call to a setter() after the first invocation of call(). But of course I don't like to have every setter to throw an checked exception which everybody has to catch.

Either an checked exception during call() or an unchecked excpetion (e.g. IllegalStateException) during call(() and every setter. UncheckException can't be subclasses of JGitInternalException

I think I would prefer a IllegalStateException thrown everywhere.

How to implement that? Really pollute every setter? I had a talk with Sasa about this and he suggested dynamic proxies. The Git factory would produce dynmic proxies instead of directly handing out the Command instance. This would require to introduce an interface for every command.
An alternative would be byte-code modifications or really a superclass for all commands having a checkState method which has to be called by convention by every call() and setter.

I'll propose the last atlernative for now and play with the dynamic proxies until I know them. Switching later should not cause big interface changes.