checkout: add --ignore-other-wortrees
Noticed-by: Mark Levedahl <mlevedahl@gmail.com> Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
							parent
							
								
									10f102be21
								
							
						
					
					
						commit
						1d0fa898ea
					
				|  | @ -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 | 	specific files such as HEAD, index... See "MULTIPLE WORKING | ||||||
| 	TREES" section for more information. | 	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>:: | <branch>:: | ||||||
| 	Branch to checkout; if it refers to a branch (i.e., a name that, | 	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 | 	when prepended with "refs/heads/", is a valid ref), then that | ||||||
|  |  | ||||||
|  | @ -37,6 +37,7 @@ struct checkout_opts { | ||||||
| 	int writeout_stage; | 	int writeout_stage; | ||||||
| 	int overwrite_ignore; | 	int overwrite_ignore; | ||||||
| 	int ignore_skipworktree; | 	int ignore_skipworktree; | ||||||
|  | 	int ignore_other_worktrees; | ||||||
|  |  | ||||||
| 	const char *new_branch; | 	const char *new_branch; | ||||||
| 	const char *new_branch_force; | 	const char *new_branch_force; | ||||||
|  | @ -1210,7 +1211,8 @@ static int parse_branchname_arg(int argc, const char **argv, | ||||||
| 		int flag; | 		int flag; | ||||||
| 		char *head_ref = resolve_refdup("HEAD", 0, sha1, &flag); | 		char *head_ref = resolve_refdup("HEAD", 0, sha1, &flag); | ||||||
| 		if (head_ref && | 		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); | 			check_linked_checkouts(new); | ||||||
| 		free(head_ref); | 		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'")), | 				N_("second guess 'git checkout no-such-branch'")), | ||||||
| 		OPT_FILENAME(0, "to", &opts.new_worktree, | 		OPT_FILENAME(0, "to", &opts.new_worktree, | ||||||
| 			   N_("check a branch out in a separate working directory")), | 			   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(), | 		OPT_END(), | ||||||
| 	}; | 	}; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @ -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' ' | test_expect_success 'not die on re-checking out current branch' ' | ||||||
| 	( | 	( | ||||||
| 		cd there && | 		cd there && | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Nguyễn Thái Ngọc Duy
						Nguyễn Thái Ngọc Duy