Subject: Re: Pushing to GitHub doesn't push all branches

From: Michael J Gruber <[email-masked]>
Date: Mon, 13 Jul 2009 13:01:15 +0200

Graeme Geldenhuys venit, vidit, dixit 13.07.2009 10:12:
> Michael J Gruber wrote:
>> git config remote.origin.push '+refs/remotes/*:refs/heads/*'
> 
> OK, I've done this, but I'm not 100% sure what this means. This is what 
> I think (from reading various git help and users guide). Any branches I 
> have which track remote references (from svn repository) will be pushed 
> to github as various head references (normal branches).  Is this correct?

Yes, any ref you have that matches the pattern refs/remotes/* (all your
remote branches) is pushed to a ref named refs/heads/* in the repo (i.e.
a branch). The + means that non-fast-forward pushes are OK.

> On our server, which contain the svn cloned repository and the one that 
> is only used for syncing svn -> our server -> github, I had to add a new 
> commit which represents the svn-ignore meta data to a .gitignore file. I 
> noticed I had to manually to a 'git checkout master' & 'git merge 
> remotes/trunk' to pull in new updates. I thin pushed that to github.

You didn't tell us *that* before... Exactly this is why I asked whether
you want to do own work on those branches or just push a git-svn mirror.

I'm not sure adding .gitignore in a commit is a good idea, if that is
the only change you will make to the original branches. It keeps you
from doing a simple fetch and forces you to set up merging.

Also, svn-metadata may change over time. Do you intend to keep
.gitignore up to date with those changes?

> So what is my twice hourly cron script supposed to look like? Is the 
> following still ok?
> 
> ========[ script executed by cron every 30 minutes ]============
> #!/bin/sh
> GIT="/usr/local/bin/git"
> 
> # FPC repository
> cd /mnt/samba/git/fpc.git/
> $GIT checkout master
> $GIT svn fetch
> $GIT gc --auto
> $GIT push github master
> ==============================
> 
> Or do I need to add a new line after '$GIT svn fetch' that does a merge.
> 
> ==============================
> $GIT svn fetch
> $GIT merge remotes/trunk
> ...
> push to github
> ==============================
> 
> 
> Also what do I do with the other branch I want to track. It's called 
> remotes/fixes_2_2.
> 
> I believe I need to first create a local branch.
> 
>    git branch --track fixes_2_2 remotes/fixes_2_2
> 
> What do I need to modify in my cron script to keep both the master & 
> fixes_2_2 branches in sync with SubVersion and push both to GitHub. I 
> want Github to show two branches: master & fixes_2_2

Well, the way you used push you completely ignored the suggested
refspec. You pushed master into a matching ref (master). master may have
happened to be trunk before you added .gitignore (git-svn does not
guarantee that).

So, there are two options:

- Push the git-svn converted branches as is, using the suggested refspec
(or having it in config and doing "git push github"). "git svn fetch"
will have fetched all svn refs you need.

- Set up local branches and do your merge thing. In this case you
probably also want to keep up with svn metadata changes (mind that
ignore properties may depend on the branch as well). Done right this is
nice, but of course it may be a bit more fragile.

In the first case you would need to distribute .gitignore in a different
way. You could set up a separate branch (say svnhelper) for that which
consists of .gitignore (and possibly other things) only. "git show
svnhelper:.gitignore > .git/info/excludes" will set up each user. You
can also use a tag for that (i.e. instead of a branch).

Cheers,
Michael