aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Sunshine <sunshine@sunshineco.com>2015-07-06 13:30:50 -0400
committerJunio C Hamano <gitster@pobox.com>2015-07-06 11:07:45 -0700
commitfc56361f58a20f1259e1ba2364424ec27825c37f (patch)
tree293d47e4d744f245ba7e656af919f5c4c7f0170a
parentbdf0f375b9cf1c272233583a03eddef1772da99e (diff)
downloadgit-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.txt20
-rw-r--r--builtin/worktree.c31
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);