On Thu, Jun 20, 2013 at 03:46:20PM -0700, Junio C Hamano wrote: > Dennis Kaarsemaker <dennis@xxxxxxxxxxxxxxx> writes: > > > When cloning a repo with --mirror, and adding more remotes later, > > get_stale_heads for origin would mark all refs from other repos as stale. In > > this situation, with refs-src and refs->dst both equal to refs/*, we should > > ignore refs/remotes/* when looking for stale refs to prevent this from > > happening. > > I do not think it is a right solution to single out refs/remotes/*. Yeah, I agree. > Going back to your original example: > > [remote "origin"] > url = git://github.com/git/git.git > fetch = +refs/*:refs/* > mirror = true > [remote "peff"] > url = git://github.com/peff/git.git > fetch = +refs/heads/*:refs/remotes/peff/* There is a fundamental namespace conflict here: one remote is claiming the whole refs/* namespace, and another remote is claiming some subset. "fetch --prune" is only one type of problem you can have; you might also overwrite stuff from the "peff" remote with stuff from the "origin" remote (if it happens to have "refs/remotes/peff/foo" itself). > I think this is an unsolvable problem, and I _think_ the root cause > of the issue is the configuration above that allows the RHS of > different fetch refspecs to overlap. refs/* is more generic and > covers refs/remotes/peff/* and refs/remotes/github/*. You cannot > even know, just by looking at "origin" and your local repository, > if refs/remotes/github/html you have should go away or it might have > come from somewhere else. Exactly. > The best we _could_ do, without contacting all the defined remotes, > is probably to check each ref that we did not see from "origin" (for > example, you find "refs/remotes/peff/frotz" that your origin does > not have) and see if it could match RHS of fetch refspec of somebody > else (e.g. RHS of "refs/heads/*:refs/remotes/peff/*" matches that > ref). Then we can conclude that refs/remotes/peff/frotz _might_ > have come from Peff's repository and not from "origin", and then we > can optionally issue a warning and refrain from removing it. I think this is just papering over the problem in one instance. What happens when you _do_ have overlapping refs in the "origin" remote, and you have a true conflict. I wonder why Dennis wants to "refs/*:refs/*" in the first place. It is not usually a useful thing to have in a non-bare repository, because fetches will overwrite local work on branches. If he just wanted the automatic "git push --mirror" setting, that does not depend on the fetch refspec. We made this distinction in "git remote --mirror={fetch,remote}", but I don't think "git clone --mirror" ever learned about it. -Peff -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html