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>
This commit is contained in:
parent
bdf0f375b9
commit
fc56361f58
@ -9,13 +9,13 @@ git-worktree - Manage multiple worktrees
|
|||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
--------
|
--------
|
||||||
[verse]
|
[verse]
|
||||||
|
'git worktree add' <path> <branch>
|
||||||
'git worktree prune' [-n] [-v] [--expire <expire>]
|
'git worktree prune' [-n] [-v] [--expire <expire>]
|
||||||
|
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
-----------
|
-----------
|
||||||
|
|
||||||
Manage multiple worktrees attached to the same repository. These are
|
Manage multiple worktrees attached to the same repository.
|
||||||
created by the command `git checkout --to`.
|
|
||||||
|
|
||||||
A git repository can support multiple working trees, allowing you to check
|
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
|
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
|
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::
|
||||||
|
|
||||||
Prune working tree information in $GIT_DIR/worktrees.
|
Prune working tree information in $GIT_DIR/worktrees.
|
||||||
@ -118,7 +124,7 @@ refactoring session.
|
|||||||
|
|
||||||
------------
|
------------
|
||||||
$ git branch emergency-fix master
|
$ git branch emergency-fix master
|
||||||
$ git checkout --to ../temp emergency-fix
|
$ git worktree add ../temp emergency-fix
|
||||||
$ pushd ../temp
|
$ pushd ../temp
|
||||||
# ... hack hack hack ...
|
# ... hack hack hack ...
|
||||||
$ git commit -a -m 'emergency fix for boss'
|
$ 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.
|
recommended to make multiple checkouts of a superproject.
|
||||||
|
|
||||||
git-worktree could provide more automation for tasks currently
|
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
|
- `remove` to remove a linked worktree and its administrative files (and
|
||||||
warn if the worktree is dirty)
|
warn if the worktree is dirty)
|
||||||
- `mv` to move or rename a worktree and update its administrative files
|
- `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,
|
- `lock` to prevent automatic pruning of administrative files (for instance,
|
||||||
for a worktree on a portable device)
|
for a worktree on a portable device)
|
||||||
|
|
||||||
SEE ALSO
|
|
||||||
--------
|
|
||||||
|
|
||||||
linkgit:git-checkout[1]
|
|
||||||
|
|
||||||
GIT
|
GIT
|
||||||
---
|
---
|
||||||
Part of the linkgit:git[1] suite
|
Part of the linkgit:git[1] suite
|
||||||
|
@ -2,8 +2,11 @@
|
|||||||
#include "builtin.h"
|
#include "builtin.h"
|
||||||
#include "dir.h"
|
#include "dir.h"
|
||||||
#include "parse-options.h"
|
#include "parse-options.h"
|
||||||
|
#include "argv-array.h"
|
||||||
|
#include "run-command.h"
|
||||||
|
|
||||||
static const char * const worktree_usage[] = {
|
static const char * const worktree_usage[] = {
|
||||||
|
N_("git worktree add <path> <branch>"),
|
||||||
N_("git worktree prune [<options>]"),
|
N_("git worktree prune [<options>]"),
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
@ -119,6 +122,32 @@ static int prune(int ac, const char **av, const char *prefix)
|
|||||||
return 0;
|
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)
|
int cmd_worktree(int ac, const char **av, const char *prefix)
|
||||||
{
|
{
|
||||||
struct option options[] = {
|
struct option options[] = {
|
||||||
@ -127,6 +156,8 @@ int cmd_worktree(int ac, const char **av, const char *prefix)
|
|||||||
|
|
||||||
if (ac < 2)
|
if (ac < 2)
|
||||||
usage_with_options(worktree_usage, options);
|
usage_with_options(worktree_usage, options);
|
||||||
|
if (!strcmp(av[1], "add"))
|
||||||
|
return add(ac - 1, av + 1, prefix);
|
||||||
if (!strcmp(av[1], "prune"))
|
if (!strcmp(av[1], "prune"))
|
||||||
return prune(ac - 1, av + 1, prefix);
|
return prune(ac - 1, av + 1, prefix);
|
||||||
usage_with_options(worktree_usage, options);
|
usage_with_options(worktree_usage, options);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user