From: Sitaram Chamarty Date: Sun, 11 Dec 2011 18:56:13 GMT Subject: Re: best way to fastforward all tracking branches after a fetch Message-ID: In-Reply-To: 2011/12/11 Jakub Narebski : > Don't remove people from Cc, please. > > Gelonida N writes: >> On 12/11/2011 03:22 AM, Sitaram Chamarty wrote: >> > On Sat, Dec 10, 2011 at 01:26:32PM +0100, Gelonida N wrote: > >> > 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. if it's not the currently checked-out branch, 'git branch -f foo origin/foo' seems to work fine. However, it only updates the branch reflog, not the HEAD reflog also, naturally. FWIW... > 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 > >> 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 -- Sitaram