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 sunsh...@sunshineco.com
---
Documentation/git-worktree.txt | 21 +++--
builtin/worktree.c | 32
2 files changed, 43 insertions(+), 10 deletions(-)
diff --git a/Documentation/git-worktree.txt b/Documentation/git-worktree.txt
index 028bbd9..59191f9 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,13 @@ pruning should be suppressed. See section DETAILS for more
information.
COMMANDS
+add path branch::
+
+Check out `branch` into a separate working directory, `path`, creating
+`path` if necessary. The new working directory is linked to the current
+repository, sharing everything except working directory specific files
+such as HEAD, index, etc. If `path` already exists, it must be empty.
+
prune::
Prune working tree information in $GIT_DIR/worktrees.
@@ -118,7 +125,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,20 +140,14 @@ 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
- `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 2a729c6..b82861e 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,33 @@ 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 +157,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);
--
2.5.0.rc1.197.g417e668
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html