worktree: add --[no-]track option to the add subcommand
Currently 'git worktree add' sets up tracking branches if '<branch>' is a remote tracking branch, and doesn't set them up otherwise, as is the default for 'git branch'. This may or may not be what the user wants. Allow overriding this behaviour with a --[no-]track flag that gets passed through to 'git branch'. We already respect branch.autoSetupMerge, as 'git worktree' just calls 'git branch' internally. Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
c4738aedc0
commit
e284e892ca
@ -107,6 +107,12 @@ OPTIONS
|
||||
such as configuring sparse-checkout. See "Sparse checkout"
|
||||
in linkgit:git-read-tree[1].
|
||||
|
||||
--[no-]track::
|
||||
When creating a new branch, if `<commit-ish>` is a branch,
|
||||
mark it as "upstream" from the new branch. This is the
|
||||
default if `<commit-ish>` is a remote-tracking branch. See
|
||||
"--track" in linkgit:git-branch[1] for details.
|
||||
|
||||
--lock::
|
||||
Keep the working tree locked after creation. This is the
|
||||
equivalent of `git worktree lock` after `git worktree add`,
|
||||
|
@ -341,6 +341,7 @@ static int add(int ac, const char **av, const char *prefix)
|
||||
const char *new_branch_force = NULL;
|
||||
char *path;
|
||||
const char *branch;
|
||||
const char *opt_track = NULL;
|
||||
struct option options[] = {
|
||||
OPT__FORCE(&opts.force, N_("checkout <branch> even if already checked out in other worktree")),
|
||||
OPT_STRING('b', NULL, &opts.new_branch, N_("branch"),
|
||||
@ -350,6 +351,9 @@ static int add(int ac, const char **av, const char *prefix)
|
||||
OPT_BOOL(0, "detach", &opts.detach, N_("detach HEAD at named commit")),
|
||||
OPT_BOOL(0, "checkout", &opts.checkout, N_("populate the new working tree")),
|
||||
OPT_BOOL(0, "lock", &opts.keep_locked, N_("keep the new working tree locked")),
|
||||
OPT_PASSTHRU(0, "track", &opt_track, NULL,
|
||||
N_("set up tracking mode (see git-branch(1))"),
|
||||
PARSE_OPT_NOARG | PARSE_OPT_OPTARG),
|
||||
OPT_END()
|
||||
};
|
||||
|
||||
@ -394,9 +398,13 @@ static int add(int ac, const char **av, const char *prefix)
|
||||
argv_array_push(&cp.args, "--force");
|
||||
argv_array_push(&cp.args, opts.new_branch);
|
||||
argv_array_push(&cp.args, branch);
|
||||
if (opt_track)
|
||||
argv_array_push(&cp.args, opt_track);
|
||||
if (run_command(&cp))
|
||||
return -1;
|
||||
branch = opts.new_branch;
|
||||
} else if (opt_track) {
|
||||
die(_("--[no-]track can only be used if a new branch is created"));
|
||||
}
|
||||
|
||||
UNLEAK(path);
|
||||
|
@ -313,5 +313,56 @@ test_expect_success 'checkout a branch under bisect' '
|
||||
test_expect_success 'rename a branch under bisect not allowed' '
|
||||
test_must_fail git branch -M under-bisect bisect-with-new-name
|
||||
'
|
||||
# Is branch "refs/heads/$1" set to pull from "$2/$3"?
|
||||
test_branch_upstream () {
|
||||
printf "%s\n" "$2" "refs/heads/$3" >expect.upstream &&
|
||||
{
|
||||
git config "branch.$1.remote" &&
|
||||
git config "branch.$1.merge"
|
||||
} >actual.upstream &&
|
||||
test_cmp expect.upstream actual.upstream
|
||||
}
|
||||
|
||||
test_expect_success '--track sets up tracking' '
|
||||
test_when_finished rm -rf track &&
|
||||
git worktree add --track -b track track master &&
|
||||
test_branch_upstream track . master
|
||||
'
|
||||
|
||||
# setup remote repository $1 and repository $2 with $1 set up as
|
||||
# remote. The remote has two branches, master and foo.
|
||||
setup_remote_repo () {
|
||||
git init $1 &&
|
||||
(
|
||||
cd $1 &&
|
||||
test_commit $1_master &&
|
||||
git checkout -b foo &&
|
||||
test_commit upstream_foo
|
||||
) &&
|
||||
git init $2 &&
|
||||
(
|
||||
cd $2 &&
|
||||
test_commit $2_master &&
|
||||
git remote add $1 ../$1 &&
|
||||
git config remote.$1.fetch \
|
||||
"refs/heads/*:refs/remotes/$1/*" &&
|
||||
git fetch --all
|
||||
)
|
||||
}
|
||||
|
||||
test_expect_success '--no-track avoids setting up tracking' '
|
||||
test_when_finished rm -rf repo_upstream repo_local foo &&
|
||||
setup_remote_repo repo_upstream repo_local &&
|
||||
(
|
||||
cd repo_local &&
|
||||
git worktree add --no-track -b foo ../foo repo_upstream/foo
|
||||
) &&
|
||||
(
|
||||
cd foo &&
|
||||
test_must_fail git config "branch.foo.remote" &&
|
||||
test_must_fail git config "branch.foo.merge" &&
|
||||
test_cmp_rev refs/remotes/repo_upstream/foo refs/heads/foo
|
||||
)
|
||||
'
|
||||
|
||||
test_done
|
||||
|
Loading…
Reference in New Issue
Block a user