git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: checkout new branch tracks wrong remote (bug?)

From
Jeff King <peff@peff.net>
Date
Mar 30, 2011, 14:59 UTC
Message-ID
<20110330145908.GA812@sigill.intra.peff.net>
In-Reply-To
<loom.20110330T040437-823@post.gmane.org>
On Wed, Mar 30, 2011 at 02:27:31AM +0000, chris wrote:
Show 11 quoted lines
> I have two remotes configured.
> 
> One is "origin" which has a local tracking branch "master" for "origin/master".
> 
> The other is "mirror" which has option mirror = true
> 
> While on the local branch master, I issue the command:
> 
> $ git checkout -b wip
> 
> The branch "wip" is created and oddly configured to track the "mirror" remote.

Right. You are creating a branch from "refs/heads/master" (the currently checked out branch). So the setup_tracking code will look for any remote which writes a tracking branch into refs/heads/master according to the configuration.

Your mirror config looks like this:
> [remote "mirror"]
>         url = ssh://chris@myserver.com/srv/git/mirrors/chris/myproject.git
>         fetch = +refs/*:refs/*
>         mirror = true

meaning that a fetch of the mirror remote will write the mirror's refs/heads/master into our local refs/heads/master. IOW, your master branch is actually configured as a remote tracking branch of the mirror (which is probably not what you want; see below).

> I do not expect this "wip" branch to be tracking the "mirror" remote, but rather
> "origin", according to the documentation.

In the absence of the mirror remote, it would not track anything. You are branching from a _local_ branch, so there is no remote to track. I think what you really want is:

  git checkout -b wip origin/master
All of that being said, I'm not sure your config makes sense:
Show 7 quoted lines
> [remote "origin"]
>         fetch = +refs/heads/*:refs/remotes/origin/*
>         url = ssh://myserver.com/srv/git/myproject.git
> [remote "mirror"]
>         url = ssh://chris@myserver.com/srv/git/mirrors/chris/myproject.git
>         fetch = +refs/*:refs/*
>         mirror = true

Your mirror is configured to overwrite everything in refs/ if you fetch from it. Meaning it will throw away anything you fetched from "origin", as well as any local work. So this config is probably not what you want.

I'm guessing what you really wanted is a remote only for pushing to, and created it with:

  git remote add --mirror mirror ssh://...
The --mirror option has problems with that case. See this thread:
  http://article.gmane.org/gmane.comp.version-control.git/161653

which has some suggestions, but nothing has been implemented yet. Probably it makes sense to allow --mirror=fetch and --mirror=push, but there is an open question of what just "--mirror" should do.

-Peff
Previous: chrisNext: Jeff King
Message 2 of 13 in “checkout new branch tracks wrong remote (bug?)”
  1. chrisMar 30, 2011
  2. Jeff KingMar 30, 2011
  3. 0/3 better "remote add --mirror" semanticsJeff King, Mar 30, 2011
  4. 1/3 remote: disallow some nonsensical option combinationsJeff King, Mar 30, 2011
  5. 2/3 remote: separate the concept of push and fetch mirrorsJeff King, Mar 30, 2011
  6. Junio C HamanoMar 30, 2011
  7. Jeff KingMar 30, 2011
  8. Junio C HamanoMar 30, 2011
  9. chrisMar 31, 2011
  10. chrisMar 31, 2011
  11. Junio C HamanoMar 31, 2011
  12. chrisMar 31, 2011
  13. 3/3 remote: deprecate --mirrorJeff King, Mar 30, 2011

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.