NULL
 };
 
-static int common_config(const char *k, const char *v, void *cb)
-{
-       int status;
-
-       status = git_sequencer_config(k, v, NULL);
-       if (status)
-               return status;
-
-       return git_default_config(k, v, NULL);
-}
-
 static const char *action_name(const struct replay_opts *opts)
 {
        return opts->action == REPLAY_REVERT ? "revert" : "cherry-pick";
        if (isatty(0))
                opts.edit = 1;
        opts.action = REPLAY_REVERT;
-       git_config(common_config, NULL);
+       sequencer_init_config(&opts);
        res = run_sequencer(argc, argv, &opts);
        if (res < 0)
                die(_("revert failed"));
        int res;
 
        opts.action = REPLAY_PICK;
-       git_config(common_config, NULL);
+       sequencer_init_config(&opts);
        res = run_sequencer(argc, argv, &opts);
        if (res < 0)
                die(_("cherry-pick failed"));
 
 static GIT_PATH_FUNC(rebase_path_strategy_opts, "rebase-merge/strategy_opts")
 static GIT_PATH_FUNC(rebase_path_allow_rerere_autoupdate, "rebase-merge/allow_rerere_autoupdate")
 
+static int git_sequencer_config(const char *k, const char *v, void *cb)
+{
+       struct replay_opts *opts = cb;
+       int status;
+
+       if (!strcmp(k, "commit.cleanup")) {
+               const char *s;
+
+               status = git_config_string(&s, k, v);
+               if (status)
+                       return status;
+
+               if (!strcmp(s, "verbatim"))
+                       opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_NONE;
+               else if (!strcmp(s, "whitespace"))
+                       opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_SPACE;
+               else if (!strcmp(s, "strip"))
+                       opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_ALL;
+               else if (!strcmp(s, "scissors"))
+                       opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_SPACE;
+               else
+                       warning(_("invalid commit message cleanup mode '%s'"),
+                                 s);
+
+               return status;
+       }
+
+       if (!strcmp(k, "commit.gpgsign")) {
+               opts->gpg_sign = git_config_bool(k, v) ? "" : NULL;
+               return 0;
+       }
+
+       status = git_gpg_config(k, v, NULL);
+       if (status)
+               return status;
+
+       return git_diff_basic_config(k, v, NULL);
+}
+
+void sequencer_init_config(struct replay_opts *opts)
+{
+       opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_NONE;
+       git_config(git_sequencer_config, opts);
+}
+
 static inline int is_rebase_i(const struct replay_opts *opts)
 {
        return opts->action == REPLAY_INTERACTIVE_REBASE;
        return run_command(&cmd);
 }
 
-static enum commit_msg_cleanup_mode default_msg_cleanup =
-                                               COMMIT_MSG_CLEANUP_NONE;
-static char *default_gpg_sign;
-
-int git_sequencer_config(const char *k, const char *v, void *cb)
-{
-       if (!strcmp(k, "commit.cleanup")) {
-               int status;
-               const char *s;
-
-               status = git_config_string(&s, k, v);
-               if (status)
-                       return status;
-
-               if (!strcmp(s, "verbatim"))
-                       default_msg_cleanup = COMMIT_MSG_CLEANUP_NONE;
-               else if (!strcmp(s, "whitespace"))
-                       default_msg_cleanup = COMMIT_MSG_CLEANUP_SPACE;
-               else if (!strcmp(s, "strip"))
-                       default_msg_cleanup = COMMIT_MSG_CLEANUP_ALL;
-               else if (!strcmp(s, "scissors"))
-                       default_msg_cleanup = COMMIT_MSG_CLEANUP_SPACE;
-
-               return status;
-       }
-
-       if (!strcmp(k, "commit.gpgsign")) {
-               default_gpg_sign = git_config_bool(k, v) ? "" : NULL;
-               return 0;
-       }
-
-       return git_gpg_config(k, v, NULL);
-}
-
 static int rest_is_empty(const struct strbuf *sb, int start)
 {
        int i, eol;
        struct strbuf err = STRBUF_INIT;
        struct strbuf amend_msg = STRBUF_INIT;
        char *amend_author = NULL;
-       const char *gpg_sign;
        enum commit_msg_cleanup_mode cleanup;
        int res = 0;
 
        }
 
        cleanup = (flags & CLEANUP_MSG) ? COMMIT_MSG_CLEANUP_ALL :
-                                         default_msg_cleanup;
+                                         opts->default_msg_cleanup;
+
        if (cleanup != COMMIT_MSG_CLEANUP_NONE)
                strbuf_stripspace(msg, cleanup == COMMIT_MSG_CLEANUP_ALL);
        if (!opts->allow_empty_message && message_is_empty(msg, cleanup)) {
                goto out;
        }
 
-       gpg_sign = opts->gpg_sign ? opts->gpg_sign : default_gpg_sign;
-
        if (write_cache_as_tree(tree.hash, 0, NULL)) {
                res = error(_("git write-tree failed to write a tree"));
                goto out;
        }
 
        if (commit_tree_extended(msg->buf, msg->len, tree.hash, parents,
-                                oid->hash, author, gpg_sign, extra)) {
+                                oid->hash, author, opts->gpg_sign, extra)) {
                res = error(_("failed to write commit object"));
                goto out;
        }
 
        REPLAY_INTERACTIVE_REBASE
 };
 
+enum commit_msg_cleanup_mode {
+       COMMIT_MSG_CLEANUP_SPACE,
+       COMMIT_MSG_CLEANUP_NONE,
+       COMMIT_MSG_CLEANUP_SCISSORS,
+       COMMIT_MSG_CLEANUP_ALL
+};
+
 struct replay_opts {
        enum replay_action action;
 
        int mainline;
 
        char *gpg_sign;
+       enum commit_msg_cleanup_mode default_msg_cleanup;
 
        /* Merge strategy */
        char *strategy;
 };
 #define REPLAY_OPTS_INIT { -1 }
 
+/* Call this to setup defaults before parsing command line options */
+void sequencer_init_config(struct replay_opts *opts);
 int sequencer_pick_revisions(struct replay_opts *opts);
 int sequencer_continue(struct replay_opts *opts);
 int sequencer_rollback(struct replay_opts *opts);
 
 void append_signoff(struct strbuf *msgbuf, int ignore_footer, unsigned flag);
 void append_conflicts_hint(struct strbuf *msgbuf);
-int git_sequencer_config(const char *k, const char *v, void *cb);
-
-enum commit_msg_cleanup_mode {
-       COMMIT_MSG_CLEANUP_SPACE,
-       COMMIT_MSG_CLEANUP_NONE,
-       COMMIT_MSG_CLEANUP_SCISSORS,
-       COMMIT_MSG_CLEANUP_ALL
-};
-
 int message_is_empty(const struct strbuf *sb,
                     enum commit_msg_cleanup_mode cleanup_mode);
 int template_untouched(const struct strbuf *sb, const char *template_file,