| #!/bin/sh | 
 |  | 
 | test_description='clone --branch option' | 
 | GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main | 
 | export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME | 
 |  | 
 | . ./test-lib.sh | 
 |  | 
 | check_HEAD() { | 
 | 	echo refs/heads/"$1" >expect && | 
 | 	git symbolic-ref HEAD >actual && | 
 | 	test_cmp expect actual | 
 | } | 
 |  | 
 | check_file() { | 
 | 	echo "$1" >expect && | 
 | 	test_cmp expect file | 
 | } | 
 |  | 
 | test_expect_success 'setup' ' | 
 | 	mkdir parent && | 
 | 	(cd parent && git init && | 
 | 	 echo one >file && git add file && git commit -m one && | 
 | 	 git checkout -b two && | 
 | 	 echo two >file && git add file && git commit -m two && | 
 | 	 git checkout main) && | 
 | 	mkdir empty && | 
 | 	(cd empty && git init) | 
 | ' | 
 |  | 
 | test_expect_success 'vanilla clone chooses HEAD' ' | 
 | 	git clone parent clone && | 
 | 	(cd clone && | 
 | 	 check_HEAD main && | 
 | 	 check_file one | 
 | 	) | 
 | ' | 
 |  | 
 | test_expect_success 'clone -b chooses specified branch' ' | 
 | 	git clone -b two parent clone-two && | 
 | 	(cd clone-two && | 
 | 	 check_HEAD two && | 
 | 	 check_file two | 
 | 	) | 
 | ' | 
 |  | 
 | test_expect_success 'clone -b sets up tracking' ' | 
 | 	(cd clone-two && | 
 | 	 echo origin >expect && | 
 | 	 git config branch.two.remote >actual && | 
 | 	 echo refs/heads/two >>expect && | 
 | 	 git config branch.two.merge >>actual && | 
 | 	 test_cmp expect actual | 
 | 	) | 
 | ' | 
 |  | 
 | test_expect_success 'clone -b does not munge remotes/origin/HEAD' ' | 
 | 	(cd clone-two && | 
 | 	 echo refs/remotes/origin/main >expect && | 
 | 	 git symbolic-ref refs/remotes/origin/HEAD >actual && | 
 | 	 test_cmp expect actual | 
 | 	) | 
 | ' | 
 |  | 
 | test_expect_success 'clone -b with bogus branch' ' | 
 | 	test_must_fail git clone -b bogus parent clone-bogus | 
 | ' | 
 |  | 
 | test_expect_success 'clone -b not allowed with empty repos' ' | 
 | 	test_must_fail git clone -b branch empty clone-branch-empty | 
 | ' | 
 |  | 
 | test_done |