diff options
author | Eric Sunshine <sunshine@sunshineco.com> | 2015-07-06 13:30:50 -0400 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2015-07-06 11:07:45 -0700 |
commit | fc56361f58a20f1259e1ba2364424ec27825c37f (patch) | |
tree | 293d47e4d744f245ba7e656af919f5c4c7f0170a | |
parent | bdf0f375b9cf1c272233583a03eddef1772da99e (diff) | |
download | git-fc56361f58a20f1259e1ba2364424ec27825c37f.tar.gz git-fc56361f58a20f1259e1ba2364424ec27825c37f.tar.xz |
worktree: introduce "add" command
The plan is to relocate "git checkout --to" functionality to "git
worktree add". As a first step, introduce a bare-bones git-worktree
"add" command along with documentation. At this stage, "git worktree
add" merely invokes "git checkout --to" behind the scenes, but an
upcoming patch will move the actual functionality
(checkout.c:prepare_linked_checkout() and its helpers) to worktree.c.
Signed-off-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r-- | Documentation/git-worktree.txt | 20 | ||||
-rw-r--r-- | builtin/worktree.c | 31 |
2 files changed, 41 insertions, 10 deletions
diff --git a/Documentation/git-worktree.txt b/Documentation/git-worktree.txt index 6afff1ed0..def3027c4 100644 --- a/Documentation/git-worktree.txt +++ b/Documentation/git-worktree.txt @@ -9,13 +9,13 @@ git-worktree - Manage multiple worktrees SYNOPSIS -------- [verse] +'git worktree add' <path> <branch> 'git worktree prune' [-n] [-v] [--expire <expire>] DESCRIPTION ----------- -Manage multiple worktrees attached to the same repository. These are -created by the command `git checkout --to`. +Manage multiple worktrees attached to the same repository. A git repository can support multiple working trees, allowing you to check out more than one branch at a time. With `git checkout --to` a new working @@ -45,6 +45,12 @@ pruning should be suppressed. See section "DETAILS" for more information. COMMANDS -------- +add <path> <branch>:: + +Create `<path>` and checkout `<branch>` into it. The new working directory +is linked to the current repository, sharing everything except working +directory specific files such as HEAD, index, etc. + prune:: Prune working tree information in $GIT_DIR/worktrees. @@ -118,7 +124,7 @@ refactoring session. ------------ $ git branch emergency-fix master -$ git checkout --to ../temp emergency-fix +$ git worktree add ../temp emergency-fix $ pushd ../temp # ... hack hack hack ... $ git commit -a -m 'emergency fix for boss' @@ -133,9 +139,8 @@ Multiple checkout support for submodules is incomplete. It is NOT recommended to make multiple checkouts of a superproject. git-worktree could provide more automation for tasks currently -performed manually or via other commands, such as: +performed manually, such as: -- `add` to create a new linked worktree - `remove` to remove a linked worktree and its administrative files (and warn if the worktree is dirty) - `mv` to move or rename a worktree and update its administrative files @@ -143,11 +148,6 @@ performed manually or via other commands, such as: - `lock` to prevent automatic pruning of administrative files (for instance, for a worktree on a portable device) -SEE ALSO --------- - -linkgit:git-checkout[1] - GIT --- Part of the linkgit:git[1] suite diff --git a/builtin/worktree.c b/builtin/worktree.c index 2a729c661..e0749c099 100644 --- a/builtin/worktree.c +++ b/builtin/worktree.c @@ -2,8 +2,11 @@ #include "builtin.h" #include "dir.h" #include "parse-options.h" +#include "argv-array.h" +#include "run-command.h" static const char * const worktree_usage[] = { + N_("git worktree add <path> <branch>"), N_("git worktree prune [<options>]"), NULL }; @@ -119,6 +122,32 @@ static int prune(int ac, const char **av, const char *prefix) return 0; } +static int add(int ac, const char **av, const char *prefix) +{ + struct child_process c; + const char *path, *branch; + struct argv_array cmd = ARGV_ARRAY_INIT; + struct option options[] = { + OPT_END() + }; + + ac = parse_options(ac, av, prefix, options, worktree_usage, 0); + if (ac != 2) + usage_with_options(worktree_usage, options); + + path = prefix ? prefix_filename(prefix, strlen(prefix), av[0]) : av[0]; + branch = av[1]; + + argv_array_push(&cmd, "checkout"); + argv_array_pushl(&cmd, "--to", path, NULL); + argv_array_push(&cmd, branch); + + memset(&c, 0, sizeof(c)); + c.git_cmd = 1; + c.argv = cmd.argv; + return run_command(&c); +} + int cmd_worktree(int ac, const char **av, const char *prefix) { struct option options[] = { @@ -127,6 +156,8 @@ int cmd_worktree(int ac, const char **av, const char *prefix) if (ac < 2) usage_with_options(worktree_usage, options); + if (!strcmp(av[1], "add")) + return add(ac - 1, av + 1, prefix); if (!strcmp(av[1], "prune")) return prune(ac - 1, av + 1, prefix); usage_with_options(worktree_usage, options); |