}
 
 static const char * const read_tree_usage[] = {
-       "git read-tree [[-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>] [-u [--exclude-per-directory=<gitignore>] | -i]] [--no-sparse-checkout] [--index-output=<file>] (--empty | <tree-ish1> [<tree-ish2> [<tree-ish3>]])",
+       N_("git read-tree [[-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>] [-u [--exclude-per-directory=<gitignore>] | -i]] [--no-sparse-checkout] [--index-output=<file>] (--empty | <tree-ish1> [<tree-ish2> [<tree-ish3>]])"),
        NULL
 };
 
        return 0;
 }
 
-static void debug_stage(const char *label, struct cache_entry *ce,
+static void debug_stage(const char *label, const struct cache_entry *ce,
                        struct unpack_trees_options *o)
 {
        printf("%s ", label);
                       sha1_to_hex(ce->sha1));
 }
 
-static int debug_merge(struct cache_entry **stages, struct unpack_trees_options *o)
+static int debug_merge(const struct cache_entry * const *stages,
+                      struct unpack_trees_options *o)
 {
        int i;
 
 
 int cmd_read_tree(int argc, const char **argv, const char *unused_prefix)
 {
-       int i, newfd, stage = 0;
+       int i, stage = 0;
        unsigned char sha1[20];
        struct tree_desc t[MAX_UNPACK_TREES];
        struct unpack_trees_options opts;
        int prefix_set = 0;
        const struct option read_tree_options[] = {
-               { OPTION_CALLBACK, 0, "index-output", NULL, "file",
-                 "write resulting index to <file>",
+               { OPTION_CALLBACK, 0, "index-output", NULL, N_("file"),
+                 N_("write resulting index to <file>"),
                  PARSE_OPT_NONEG, index_output_cb },
                OPT_SET_INT(0, "empty", &read_empty,
-                           "only empty the index", 1),
-               OPT__VERBOSE(&opts.verbose_update, "be verbose"),
-               OPT_GROUP("Merging"),
+                           N_("only empty the index"), 1),
+               OPT__VERBOSE(&opts.verbose_update, N_("be verbose")),
+               OPT_GROUP(N_("Merging")),
                OPT_SET_INT('m', NULL, &opts.merge,
-                           "perform a merge in addition to a read", 1),
+                           N_("perform a merge in addition to a read"), 1),
                OPT_SET_INT(0, "trivial", &opts.trivial_merges_only,
-                           "3-way merge if no file level merging required", 1),
+                           N_("3-way merge if no file level merging required"), 1),
                OPT_SET_INT(0, "aggressive", &opts.aggressive,
-                           "3-way merge in presence of adds and removes", 1),
+                           N_("3-way merge in presence of adds and removes"), 1),
                OPT_SET_INT(0, "reset", &opts.reset,
-                           "same as -m, but discard unmerged entries", 1),
-               { OPTION_STRING, 0, "prefix", &opts.prefix, "<subdirectory>/",
-                 "read the tree into the index under <subdirectory>/",
+                           N_("same as -m, but discard unmerged entries"), 1),
+               { OPTION_STRING, 0, "prefix", &opts.prefix, N_("<subdirectory>/"),
+                 N_("read the tree into the index under <subdirectory>/"),
                  PARSE_OPT_NONEG | PARSE_OPT_LITERAL_ARGHELP },
                OPT_SET_INT('u', NULL, &opts.update,
-                           "update working tree with merge result", 1),
+                           N_("update working tree with merge result"), 1),
                { OPTION_CALLBACK, 0, "exclude-per-directory", &opts,
-                 "gitignore",
-                 "allow explicitly ignored files to be overwritten",
+                 N_("gitignore"),
+                 N_("allow explicitly ignored files to be overwritten"),
                  PARSE_OPT_NONEG, exclude_per_directory_cb },
                OPT_SET_INT('i', NULL, &opts.index_only,
-                           "don't check the working tree after merging", 1),
-               OPT__DRY_RUN(&opts.dry_run, "don't update the index or the work tree"),
+                           N_("don't check the working tree after merging"), 1),
+               OPT__DRY_RUN(&opts.dry_run, N_("don't update the index or the work tree")),
                OPT_SET_INT(0, "no-sparse-checkout", &opts.skip_sparse_checkout,
-                           "skip applying sparse checkout filter", 1),
+                           N_("skip applying sparse checkout filter"), 1),
                OPT_SET_INT(0, "debug-unpack", &opts.debug_unpack,
-                           "debug unpack-trees", 1),
+                           N_("debug unpack-trees"), 1),
                OPT_END()
        };
 
        argc = parse_options(argc, argv, unused_prefix, read_tree_options,
                             read_tree_usage, 0);
 
-       newfd = hold_locked_index(&lock_file, 1);
+       hold_locked_index(&lock_file, 1);
 
        prefix_set = opts.prefix ? 1 : 0;
        if (1 < opts.merge + opts.reset + prefix_set)
                die("Which one? -m, --reset, or --prefix?");
 
+       /*
+        * NEEDSWORK
+        *
+        * The old index should be read anyway even if we're going to
+        * destroy all index entries because we still need to preserve
+        * certain information such as index version or split-index
+        * mode.
+        */
+
        if (opts.reset || opts.merge || opts.prefix) {
                if (read_cache_unmerged() && (opts.prefix || opts.merge))
                        die("You need to resolve your current index first");
 
        if (1 < opts.index_only + opts.update)
                die("-u and -i at the same time makes no sense");
-       if ((opts.update||opts.index_only) && !opts.merge)
+       if ((opts.update || opts.index_only) && !opts.merge)
                die("%s is meaningless without -m, --reset, or --prefix",
                    opts.update ? "-u" : "-i");
        if ((opts.dir && !opts.update))
         * what came from the tree.
         */
        if (nr_trees == 1 && !opts.prefix)
-               prime_cache_tree(&active_cache_tree, trees[0]);
+               prime_cache_tree(&the_index, trees[0]);
 
-       if (write_cache(newfd, active_cache, active_nr) ||
-           commit_locked_index(&lock_file))
+       if (write_locked_index(&the_index, &lock_file, COMMIT_LOCK))
                die("unable to write new index file");
        return 0;
 }