From 1d0fa898eaa879d2fa4785164c3261dd40fe5f89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nguy=E1=BB=85n=20Th=C3=A1i=20Ng=E1=BB=8Dc=20Duy?= Date: Sat, 3 Jan 2015 16:41:26 +0700 Subject: [PATCH] checkout: add --ignore-other-wortrees MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Noticed-by: Mark Levedahl Signed-off-by: Nguyễn Thái Ngọc Duy Signed-off-by: Junio C Hamano --- Documentation/git-checkout.txt | 6 ++++++ builtin/checkout.c | 6 +++++- t/t2025-checkout-to.sh | 7 +++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/Documentation/git-checkout.txt b/Documentation/git-checkout.txt index 0c13825e61..52eaa484c8 100644 --- a/Documentation/git-checkout.txt +++ b/Documentation/git-checkout.txt @@ -232,6 +232,12 @@ section of linkgit:git-add[1] to learn how to operate the `--patch` mode. specific files such as HEAD, index... See "MULTIPLE WORKING TREES" section for more information. +--ignore-other-worktrees:: + `git checkout` refuses when the wanted ref is already checked + out by another worktree. This option makes it check the ref + out anyway. In other words, the ref can be held by more than one + worktree. + :: Branch to checkout; if it refers to a branch (i.e., a name that, when prepended with "refs/heads/", is a valid ref), then that diff --git a/builtin/checkout.c b/builtin/checkout.c index d8717efb07..8b2bf2093b 100644 --- a/builtin/checkout.c +++ b/builtin/checkout.c @@ -37,6 +37,7 @@ struct checkout_opts { int writeout_stage; int overwrite_ignore; int ignore_skipworktree; + int ignore_other_worktrees; const char *new_branch; const char *new_branch_force; @@ -1210,7 +1211,8 @@ static int parse_branchname_arg(int argc, const char **argv, int flag; char *head_ref = resolve_refdup("HEAD", 0, sha1, &flag); if (head_ref && - (!(flag & REF_ISSYMREF) || strcmp(head_ref, new->path))) + (!(flag & REF_ISSYMREF) || strcmp(head_ref, new->path)) && + !opts->ignore_other_worktrees) check_linked_checkouts(new); free(head_ref); } @@ -1341,6 +1343,8 @@ int cmd_checkout(int argc, const char **argv, const char *prefix) N_("second guess 'git checkout no-such-branch'")), OPT_FILENAME(0, "to", &opts.new_worktree, N_("check a branch out in a separate working directory")), + OPT_BOOL(0, "ignore-other-worktrees", &opts.ignore_other_worktrees, + N_("do not check if another worktree is holding the given ref")), OPT_END(), }; diff --git a/t/t2025-checkout-to.sh b/t/t2025-checkout-to.sh index 915b506b6c..f8e4df4818 100755 --- a/t/t2025-checkout-to.sh +++ b/t/t2025-checkout-to.sh @@ -79,6 +79,13 @@ test_expect_success 'die the same branch is already checked out' ' ) ' +test_expect_success 'not die the same branch is already checked out' ' + ( + cd here && + git checkout --ignore-other-worktrees --to anothernewmaster newmaster + ) +' + test_expect_success 'not die on re-checking out current branch' ' ( cd there && -- GitLab