Re: best way to fastforward all tracking branches after a fetch
- From
Jakub Narebski <jnareb@gmail.com>
- Date
- Dec 11, 2011, 18:22 UTC
- Message-ID
- <m3ehwbge8f.fsf@localhost.localdomain>
- In-Reply-To
- <jc2l2a$som$1@dough.gmane.org>
Don't remove people from Cc, please.
Gelonida N <gelonida@gmail.com> writes:
> On 12/11/2011 03:22 AM, Sitaram Chamarty wrote: > > On Sat, Dec 10, 2011 at 01:26:32PM +0100, Gelonida N wrote:
Show 15 quoted lines
> > So what you want would boil down to this script (untested):
> >
> > #!/bin/bash
> > git status --porcelain -uno | grep . && {echo dirty tree, exiting...; exit 1; }
> >
> > for b in `git for-each-ref '--format=%(refname:short)' refs/heads`
> > do
> > git checkout $b
> > git merge --ff-only @{u}
> > done
>
> Is there no way to distinguish tracking branches from other branches?
> without checking them out?
>
> In order to save time I'd like to avoid checking out local branches.You can use 'upstream' field name in git-for-each-ref invocation, for example
git for-each-ref '--format=%(refname:short) %(upstream:short)' refs/heads | grep -e ' [^ ]' | sed -e 's/ .*$// This could probably be done using only sed -- grep is not necessary.
> Ideally I would even like to avoid checking out branches, which don't > need to be forwarded.
You can use git-update-ref plumbing, but you would have to do the check if it does fast-forward yourself, and provide reflog message yourself too. Something like
git for-each-ref '--format=%(refname) %(upstream)' | while read refname upstream do # there is upstream test -n "$upstream" || break # and if fast-forwards test $(git merge-base $refname $upstream) = $(git rev-parse $refname) || break git update-ref -m "$message" $refname $upstream done
Show 11 quoted lines
> I also had to remember on which branch I was in order to avoid, that I > am at a random branch after running the script. > > I could imagine something like my snippet below , though I guess, > there's something more elegant. > > git stash > mybranch=`git branch | sed -n 's/\* *//p'` > # do_script . . . > git checkout $mybranch > git stash apply
Don't use git-branch in scripting. See __git_ps1 function in contrib/completion/git-completion.bash how it can be done:
b="$(git symbolic-ref HEAD 2>/dev/null)" || b="$(git rev-parse --verify HEAD)"
Nb. the second part is here only if there is possibility that you are on detached HEAD (unnamed branch).
HTH (hope that helps)
-- Jakub Narębski