diff --git a/Documentation/git-worktree.txt b/Documentation/git-worktree.txt index 6afff1ed0c..def3027c41 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' 'git worktree prune' [-n] [-v] [--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 :: + +Create `` and checkout `` 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 2a729c661c..e0749c0998 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 "), N_("git worktree prune []"), 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);