Allow git-checkout when on a non-existant branch.
I've seen some users get into situtations where their HEAD symbolic-ref is pointing at a non-existant ref. (Sometimes this happens during clone when the remote repository lacks a 'master' branch.) If this happens the user is unable to use git-checkout to switch branches as there is no prior commit to merge from. So instead of giving the user low-level errors about how HEAD can't be resolved and how not a single revision was given change the type of checkout to be a force and go through with the user's request anyway. Signed-off-by: Shawn O. Pearce <spearce@spearce.org> Signed-off-by: Junio C Hamano <junkio@cox.net>maint
							parent
							
								
									4a0641b7cf
								
							
						
					
					
						commit
						5a03e7f253
					
				|  | @ -4,8 +4,8 @@ USAGE='[-f] [-b <new_branch>] [-m] [<branch>] [<paths>...]' | ||||||
| SUBDIRECTORY_OK=Sometimes | SUBDIRECTORY_OK=Sometimes | ||||||
| . git-sh-setup | . git-sh-setup | ||||||
|  |  | ||||||
| old=$(git-rev-parse HEAD) |  | ||||||
| old_name=HEAD | old_name=HEAD | ||||||
|  | old=$(git-rev-parse --verify $old_name 2>/dev/null) | ||||||
| new= | new= | ||||||
| new_name= | new_name= | ||||||
| force= | force= | ||||||
|  | @ -139,6 +139,13 @@ fi | ||||||
| 	die "git checkout: to checkout the requested commit you need to specify  | 	die "git checkout: to checkout the requested commit you need to specify  | ||||||
|               a name for a new branch which is created and switched to" |               a name for a new branch which is created and switched to" | ||||||
|  |  | ||||||
|  | if [ "X$old" = X ] | ||||||
|  | then | ||||||
|  | 	echo "warning: You do not appear to currently be on a branch." >&2 | ||||||
|  | 	echo "warning: Forcing checkout of $new_name." >&2 | ||||||
|  | 	force=1 | ||||||
|  | fi | ||||||
|  |  | ||||||
| if [ "$force" ] | if [ "$force" ] | ||||||
| then | then | ||||||
|     git-read-tree --reset -u $new |     git-read-tree --reset -u $new | ||||||
|  |  | ||||||
|  | @ -31,6 +31,15 @@ test_expect_success setup ' | ||||||
| 	git checkout master | 	git checkout master | ||||||
| ' | ' | ||||||
|  |  | ||||||
|  | test_expect_success "checkout from non-existing branch" ' | ||||||
|  |  | ||||||
|  | 	git checkout -b delete-me master && | ||||||
|  | 	rm .git/refs/heads/delete-me && | ||||||
|  | 	test refs/heads/delete-me = "$(git symbolic-ref HEAD)" && | ||||||
|  | 	git checkout master && | ||||||
|  | 	test refs/heads/master = "$(git symbolic-ref HEAD)" | ||||||
|  | ' | ||||||
|  |  | ||||||
| test_expect_success "checkout with dirty tree without -m" ' | test_expect_success "checkout with dirty tree without -m" ' | ||||||
|  |  | ||||||
| 	fill 0 1 2 3 4 5 >one && | 	fill 0 1 2 3 4 5 >one && | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Shawn Pearce
						Shawn Pearce