This is equivalent to "git init;git add .;git commit -q -m blah". I find myself doing that too many times, hence this shortcut. In future, --fast-import support would also be nice if the import directory has a lot of files. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> --- > > +-m:: > > +--import[=<message>]:: > > Nit: -m made sense when it specified a message. But now that it doesn't > take a message, maybe "-i" would be more appropriate? Makes sense. Documentation/git-init.txt | 18 +++++++++++++++++- builtin-init-db.c | 44 ++++++++++++++++++++++++++++++++++++++++---- t/t0001-init.sh | 44 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 101 insertions(+), 5 deletions(-) diff --git a/Documentation/git-init.txt b/Documentation/git-init.txt index 71749c0..1df07c2 100644 --- a/Documentation/git-init.txt +++ b/Documentation/git-init.txt @@ -8,7 +8,8 @@ git-init - Create an empty git repository or reinitialize an existing one SYNOPSIS -------- -'git init' [-q | --quiet] [--bare] [--template=<template_directory>] [--shared[=<permissions>]] +'git init' [-q | --quiet] [--bare] [--template=<template_directory>] + [--shared[=<permissions>]] [-i | --import[=<message>]] OPTIONS @@ -68,6 +69,21 @@ By default, the configuration flag receive.denyNonFastForwards is enabled in shared repositories, so that you cannot force a non fast-forwarding push into it. +-i:: +--import[=<message>]:: + +Commit everything to the newly initialized repository. This is equivalent to: + +---------------- +$ git init +$ git add . +$ git commit -q -m <message> +---------------- + +If `-i` is used or no message is given to `--import`, "Initial commit" will be +used as the commit message. +This option does not work with `--bare` nor already initialized repository. + -- diff --git a/builtin-init-db.c b/builtin-init-db.c index ee3911f..ff6a141 100644 --- a/builtin-init-db.c +++ b/builtin-init-db.c @@ -6,6 +6,7 @@ #include "cache.h" #include "builtin.h" #include "exec_cmd.h" +#include "run-command.h" #ifndef DEFAULT_GIT_TEMPLATE_DIR #define DEFAULT_GIT_TEMPLATE_DIR "/usr/share/git-core/templates" @@ -19,6 +20,7 @@ static int init_is_bare_repository = 0; static int init_shared_repository = -1; +static int reinit; static void safe_create_dir(const char *dir, int share) { @@ -279,7 +281,7 @@ int init_db(const char *template_dir, unsigned int flags) { const char *sha1_dir; char *path; - int len, reinit; + int len; safe_create_dir(get_git_dir(), 0); @@ -363,8 +365,29 @@ static int guess_repository_type(const char *git_dir) return 1; } +static int import_files(const char *import_message) +{ + const char *args[6]; + int i = 0; + int ret; + + args[i++] = "add"; + args[i++] = "."; + args[i] = NULL; + ret = run_command_v_opt(args, RUN_GIT_CMD); + if (ret) + return ret; + i = 0; + args[i++] = "commit"; + args[i++] = "-q"; + args[i++] = "-m"; + args[i++] = import_message; + args[i] = NULL; + return run_command_v_opt(args, RUN_GIT_CMD); +} + static const char init_db_usage[] = -"git init [-q | --quiet] [--bare] [--template=<template-directory>] [--shared[=<permissions>]]"; +"git init [-q | --quiet] [--bare] [--template=<template-directory>] [--shared[=<permissions>]] [-i|--import[=<message>]]"; /* * If you want to, you can share the DB area with any number of branches. @@ -377,7 +400,8 @@ int cmd_init_db(int argc, const char **argv, const char *prefix) const char *git_dir; const char *template_dir = NULL; unsigned int flags = 0; - int i; + const char *import_message = NULL; + int ret, i; for (i = 1; i < argc; i++, argv++) { const char *arg = argv[1]; @@ -392,12 +416,19 @@ int cmd_init_db(int argc, const char **argv, const char *prefix) init_shared_repository = PERM_GROUP; else if (!prefixcmp(arg, "--shared=")) init_shared_repository = git_config_perm("arg", arg+9); + else if (!strcmp(arg, "--import") || !strcmp(arg, "-i")) + import_message = "Initial commit"; + else if (!prefixcmp(arg, "--import=")) + import_message = arg+9; else if (!strcmp(arg, "-q") || !strcmp(arg, "--quiet")) flags |= INIT_DB_QUIET; else usage(init_db_usage); } + if (import_message && is_bare_repository_cfg == 1) + die("--import does not work with --bare"); + /* * GIT_WORK_TREE makes sense only in conjunction with GIT_DIR * without --bare. Catch the error early. @@ -440,5 +471,10 @@ int cmd_init_db(int argc, const char **argv, const char *prefix) set_git_dir(make_absolute_path(git_dir)); - return init_db(template_dir, flags); + ret = init_db(template_dir, flags); + if (ret || !import_message) + return ret; + if (reinit) + die("--import does not work with already initialized repository"); + return import_files(import_message); } diff --git a/t/t0001-init.sh b/t/t0001-init.sh index 5ac0a27..b8e8bfc 100755 --- a/t/t0001-init.sh +++ b/t/t0001-init.sh @@ -199,4 +199,48 @@ test_expect_success 'init honors global core.sharedRepository' ' x`git config -f shared-honor-global/.git/config core.sharedRepository` ' +test_expect_success 'init --import does not work with --bare' ' + ( + unset GIT_DIR GIT_WORK_TREE GIT_CONFIG + mkdir init-import-bare.git && + cd init-import-bare.git && + ! git init --bare --import + ) + +' + +test_expect_success 'init --import no message' ' + ( + test_tick + unset GIT_DIR GIT_WORK_TREE GIT_CONFIG + mkdir init-import-nomsg && + cd init-import-nomsg && + touch foo bar && + git init --import && + test "$(git rev-parse HEAD)" = 4ff955458fd61a7b5d798b81e28c9249e8ebb5df + ) +' + +test_expect_success 'init --import=msg' ' + ( + test_tick + unset GIT_DIR GIT_WORK_TREE GIT_CONFIG + mkdir init-import && + cd init-import && + touch foo bar && + git init --import=test && + test "$(git rev-parse HEAD)" = 758aa5a579e42200a6fd4e4964c7e1dc1875d67d + ) +' + +test_expect_success 'init --import on already init(ed) should fail' ' + ( + test_tick + unset GIT_DIR GIT_WORK_TREE GIT_CONFIG + cd init-import && + ! git init --import=testagain && + test "$(git rev-parse HEAD)" = 758aa5a579e42200a6fd4e4964c7e1dc1875d67d + ) +' + test_done -- 1.6.1.446.gc7851 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html