path: root/builtin/clone.c
diff options
authorJeff King <>2011-06-09 20:56:19 (GMT)
committerJunio C Hamano <>2011-06-22 18:25:21 (GMT)
commit84054f79de35015fc92f73ec4780102dd820e452 (patch)
tree9b85fe6d35164284cd5601ffd051011c4224512f /builtin/clone.c
parent2496844bb2e5410019bf51c10b1f3068b621fa27 (diff)
clone: accept config options on the command line
Clone does all of init, "remote add", fetch, and checkout without giving the user a chance to intervene and set any configuration. This patch allows you to set config options in the newly created repository after the clone, but before we do any other operations. In many cases, this is a minor convenience over something like: git clone git://... git config core.whatever true But in some cases, it can bring extra efficiency by changing how the fetch or checkout work. For example, setting line-ending config before the checkout avoids having to re-checkout all of the contents with the correct line endings. It also provides a mechanism for passing information to remote helpers during a clone; the helpers may read the git config to influence how they operate. Signed-off-by: Jeff King <> Signed-off-by: Junio C Hamano <>
Diffstat (limited to 'builtin/clone.c')
1 files changed, 20 insertions, 1 deletions
diff --git a/builtin/clone.c b/builtin/clone.c
index f579794..a15784a 100644
--- a/builtin/clone.c
+++ b/builtin/clone.c
@@ -46,6 +46,7 @@ static const char *real_git_dir;
static char *option_upload_pack = "git-upload-pack";
static int option_verbosity;
static int option_progress;
+static struct string_list option_config;
static struct option builtin_clone_options[] = {
@@ -83,7 +84,8 @@ static struct option builtin_clone_options[] = {
"create a shallow clone of that depth"),
OPT_STRING(0, "separate-git-dir", &real_git_dir, "gitdir",
"separate git dir from working tree"),
+ OPT_STRING_LIST('c', "config", &option_config, "key=value",
+ "set config inside the new repository"),
@@ -364,6 +366,22 @@ static void write_remote_refs(const struct ref *local_refs)
+static int write_one_config(const char *key, const char *value, void *data)
+ return git_config_set_multivar(key, value ? value : "true", "^$", 0);
+static void write_config(struct string_list *config)
+ int i;
+ for (i = 0; i < config->nr; i++) {
+ if (git_config_parse_parameter(config->items[i].string,
+ write_one_config, NULL) < 0)
+ die("unable to write parameters to config file");
+ }
int cmd_clone(int argc, const char **argv, const char *prefix)
int is_bundle = 0, is_local;
@@ -482,6 +500,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
printf(_("Cloning into %s...\n"), dir);
init_db(option_template, INIT_DB_QUIET);
+ write_config(&option_config);
* At this point, the config exists, so we do not need the