Merge branch 'jh/checkout-auto-tracking' into maint

"git branch --track" had a minor regression in v1.8.3.2 and later
that made it impossible to base your local work on anything but a
local branch of the upstream repository you are tracking from.

* jh/checkout-auto-tracking:
  t3200: fix failure on case-insensitive filesystems
  branch.c: Relax unnecessary requirement on upstream's remote ref name
  t3200: Add test demonstrating minor regression in 41c21f2
  Refer to branch.<name>.remote/merge when documenting --track
  t3200: Minor fix when preparing for tracking failure
  t2024: Fix &&-chaining and a couple of typos
This commit is contained in:
Junio C Hamano
2013-10-23 13:32:50 -07:00
4 changed files with 45 additions and 8 deletions

View File

@ -48,7 +48,8 @@ working tree to it; use "git checkout <newbranch>" to switch to the
new branch. new branch.
When a local branch is started off a remote-tracking branch, Git sets up the When a local branch is started off a remote-tracking branch, Git sets up the
branch so that 'git pull' will appropriately merge from branch (specifically the `branch.<name>.remote` and `branch.<name>.merge`
configuration entries) so that 'git pull' will appropriately merge from
the remote-tracking branch. This behavior may be changed via the global the remote-tracking branch. This behavior may be changed via the global
`branch.autosetupmerge` configuration flag. That setting can be `branch.autosetupmerge` configuration flag. That setting can be
overridden by using the `--track` and `--no-track` options, and overridden by using the `--track` and `--no-track` options, and
@ -156,7 +157,8 @@ This option is only applicable in non-verbose mode.
-t:: -t::
--track:: --track::
When creating a new branch, set up configuration to mark the When creating a new branch, set up `branch.<name>.remote` and
`branch.<name>.merge` configuration entries to mark the
start-point branch as "upstream" from the new branch. This start-point branch as "upstream" from the new branch. This
configuration will tell git to show the relationship between the configuration will tell git to show the relationship between the
two branches in `git status` and `git branch -v`. Furthermore, two branches in `git status` and `git branch -v`. Furthermore,

View File

@ -203,8 +203,7 @@ static int check_tracking_branch(struct remote *remote, void *cb_data)
struct refspec query; struct refspec query;
memset(&query, 0, sizeof(struct refspec)); memset(&query, 0, sizeof(struct refspec));
query.dst = tracking_branch; query.dst = tracking_branch;
return !(remote_find_tracking(remote, &query) || return !remote_find_tracking(remote, &query);
prefixcmp(query.src, "refs/heads/"));
} }
static int validate_remote_tracking_branch(char *ref) static int validate_remote_tracking_branch(char *ref)

View File

@ -104,7 +104,7 @@ test_expect_success 'setup more remotes with unconventional refspecs' '
cd repo_c && cd repo_c &&
test_commit c_master && test_commit c_master &&
git checkout -b bar && git checkout -b bar &&
test_commit c_bar test_commit c_bar &&
git checkout -b spam && git checkout -b spam &&
test_commit c_spam test_commit c_spam
) && ) &&
@ -113,9 +113,9 @@ test_expect_success 'setup more remotes with unconventional refspecs' '
cd repo_d && cd repo_d &&
test_commit d_master && test_commit d_master &&
git checkout -b baz && git checkout -b baz &&
test_commit f_baz test_commit d_baz &&
git checkout -b eggs && git checkout -b eggs &&
test_commit c_eggs test_commit d_eggs
) && ) &&
git remote add repo_c repo_c && git remote add repo_c repo_c &&
git config remote.repo_c.fetch \ git config remote.repo_c.fetch \

View File

@ -319,8 +319,9 @@ test_expect_success 'test tracking setup (non-wildcard, matching)' '
test_expect_success 'tracking setup fails on non-matching refspec' ' test_expect_success 'tracking setup fails on non-matching refspec' '
git config remote.local.url . && git config remote.local.url . &&
git config remote.local.fetch refs/heads/s:refs/remotes/local/s && git config remote.local.fetch refs/heads/*:refs/remotes/local/* &&
(git show-ref -q refs/remotes/local/master || git fetch local) && (git show-ref -q refs/remotes/local/master || git fetch local) &&
git config remote.local.fetch refs/heads/s:refs/remotes/local/s &&
test_must_fail git branch --track my5 local/master && test_must_fail git branch --track my5 local/master &&
test_must_fail git config branch.my5.remote && test_must_fail git config branch.my5.remote &&
test_must_fail git config branch.my5.merge test_must_fail git config branch.my5.merge
@ -870,4 +871,39 @@ test_expect_success '--merged catches invalid object names' '
test_must_fail git branch --merged 0000000000000000000000000000000000000000 test_must_fail git branch --merged 0000000000000000000000000000000000000000
' '
test_expect_success 'tracking with unexpected .fetch refspec' '
rm -rf a b c d &&
git init a &&
(
cd a &&
test_commit a
) &&
git init b &&
(
cd b &&
test_commit b
) &&
git init c &&
(
cd c &&
test_commit c &&
git remote add a ../a &&
git remote add b ../b &&
git fetch --all
) &&
git init d &&
(
cd d &&
git remote add c ../c &&
git config remote.c.fetch "+refs/remotes/*:refs/remotes/*" &&
git fetch c &&
git branch --track local/a/master remotes/a/master &&
test "$(git config branch.local/a/master.remote)" = "c" &&
test "$(git config branch.local/a/master.merge)" = "refs/remotes/a/master" &&
git rev-parse --verify a >expect &&
git rev-parse --verify local/a/master >actual &&
test_cmp expect actual
)
'
test_done test_done