Re: best way to fastforward all tracking branches after a fetch
- From
Sitaram Chamarty <sitaramc@gmail.com>
- Date
- Dec 11, 2011, 18:56 UTC
- Message-ID
- <CAMK1S_gjZSBv5ASz4GhV25TsRKuzBvZ9D7_X+bniP9K0BQQCmA@mail.gmail.com>
- In-Reply-To
- <m3ehwbge8f.fsf@localhost.localdomain>
2011/12/11 Jakub Narebski <jnareb@gmail.com>:
Show 37 quoted lines
> 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:
>
>> > 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...
Show 36 quoted lines
> 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