76 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
			
		
		
	
	
			76 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
| #!/bin/sh
 | |
| . git-sh-setup-script || die "Not a git archive"
 | |
| 
 | |
| old=$(git-rev-parse HEAD)
 | |
| new=
 | |
| force=
 | |
| branch=
 | |
| newbranch=
 | |
| while [ "$#" != "0" ]; do
 | |
|     arg="$1"
 | |
|     shift
 | |
|     case "$arg" in
 | |
| 	"-b")
 | |
| 		newbranch="$1"
 | |
| 		shift
 | |
| 		[ -z "$newbranch" ] &&
 | |
| 			die "git checkout: -b needs a branch name"
 | |
| 		[ -e "$GIT_DIR/refs/heads/$newbranch" ] &&
 | |
| 			die "git checkout: branch $newbranch already exists"
 | |
| 		;;
 | |
| 	"-f")
 | |
| 		force=1
 | |
| 		;;
 | |
| 	*)
 | |
| 		rev=$(git-rev-parse --verify "$arg^0") || exit
 | |
| 		if [ -z "$rev" ]; then
 | |
| 			echo "unknown flag $arg"
 | |
| 			exit 1
 | |
| 		fi
 | |
| 		if [ "$new" ]; then
 | |
| 			echo "Multiple revisions?"
 | |
| 			exit 1
 | |
| 		fi
 | |
| 		new="$rev"
 | |
| 		if [ -f "$GIT_DIR/refs/heads/$arg" ]; then
 | |
| 			branch="$arg"
 | |
| 		fi
 | |
| 		;;
 | |
|     esac
 | |
|     i=$(($i+1))
 | |
| done
 | |
| [ -z "$new" ] && new=$old
 | |
| 
 | |
| #
 | |
| # If we don't have an old branch that we're switching to,
 | |
| # and we don't have a new branch name for the target we
 | |
| # are switching to, then we'd better just be checking out
 | |
| # what we already had
 | |
| #
 | |
| [ -z "$branch$newbranch" ] &&
 | |
| 	[ "$new" != "$old" ] &&
 | |
| 	die "git checkout: you need to specify a new branch name"
 | |
| 
 | |
| if [ "$force" ]
 | |
| then
 | |
|     git-read-tree --reset $new &&
 | |
| 	git-checkout-cache -q -f -u -a
 | |
| else
 | |
|     git-read-tree -m -u $old $new
 | |
| fi
 | |
| 
 | |
| # 
 | |
| # Switch the HEAD pointer to the new branch if it we
 | |
| # checked out a branch head, and remove any potential
 | |
| # old MERGE_HEAD's (subsequent commits will clearly not
 | |
| # be based on them, since we re-set the index)
 | |
| #
 | |
| if [ "$?" -eq 0 ]; then
 | |
| 	if [ "$newbranch" ]; then
 | |
| 		echo $new > "$GIT_DIR/refs/heads/$newbranch"
 | |
| 		branch="$newbranch"
 | |
| 	fi
 | |
| 	[ "$branch" ] && ln -sf "refs/heads/$branch" "$GIT_DIR/HEAD"
 | |
| 	rm -f "$GIT_DIR/MERGE_HEAD"
 | |
| fi
 |