Default behavior is the same Executors: - Default: `run()` w/ a pass-through to show real time stderr of progress - `subprocess.run` pass-through - `SubprocessCommand` generates functions in dataclasses you can invoke later Rather than immediately running a `SubprocessCommand`, you can introspect, pickle it, adjust it, etc. `Git(executor=SubprocessCommand)` - Bring your own If you're not satisfied and don't think a PR will do, create your own executor class. If you do, you may want to either 1.) override the class's `#run()` or 2.) pass a `run_fn` to override it.