How to update my fork to have the same branches and tags as the original repository on github?

前端 未结 4 979
长发绾君心
长发绾君心 2020-12-12 11:55

When you fork a repository on github your forked repo contains all branches and tags.

Over time these branches and tags gets outdated.

How does one as easy i

相关标签:
4条回答
  • 2020-12-12 12:44

    Here https://asciinema.org/a/lv9v5mh1GGQJsfKIzUSlzsg7i is a no huzz-fuzz actual demo how I sync my cloned repo's master and release-18.09 branches from upstream.

    0 讨论(0)
  • 2020-12-12 12:46

    You would still need a local clone, which would:

    • fetch and update all the upstream branches into local branches (git fetch upstream, with upstream being a reference to the original repo you have forked)
      See "How do I clone all remote branches with Git?" for more on having all remote branches as local branches.
      I use this one-liner from the question "Track all remote git branches as local branches".
      See also "What is the difference between origin and upstream in GitHub"

    upstream and fork

    • git push --all origin (origin being your fork): that supposes that:
      • you have all the local branches tracking all the upstream branches (see previous step).
        Otherwise, you would push only one local branch by default, since a clone would create only one local branch (the default one)
      • you haven't pushed commits of your own on those branches.
    0 讨论(0)
  • 2020-12-12 12:54

    You can directly push the remote refs. Obviously this doesn't take into account changes in the fork, But it still answers the question. And if the changes are limited then you can easily merge/rebase them using your local branches.

    git push -f origin refs/remotes/upstream/*:refs/heads/*
    
    0 讨论(0)
  • 2020-12-12 13:01

    This assumes your "upstream" remote is named "origin" and you have your custom fork under your username (i.e. "maxandersen")

    When you have your clone run the following one-liner (refresh of Track all remote git branches as local branches :

    remote=origin ; for brname in `git branch -r | grep origin | grep -v master | grep -v HEAD | sed -e 's/.*\///g'`; do git branch --track $brname  $remote/$brname ; done
    

    This will setup tracking branches for all the branches found in the remote named 'origin'. If you already have a checkout with this branchname it will not change anything except ensure the tracking is in place.

    (Optional) Now ensure all your branches are uptodate (useful if you have already branches checked out):

    git pull --rebase --all
    

    Now with all branches setup for tracking and uptodate push branches and tags to your remote (replace 'maxandersen' with your remote name):

    git push --all maxandersen
    git push --tags maxandersen
    

    After this your fork is in sync.

    The following script does all this including asking for confirmation:

    ## Checkout all branches from remote as tracking branches. Based on    https://stackoverflow.com/questions/379081/track-all-remote-git-branches-as-local-branches/6300386#6300386
    
    UPSTREAM=$1
    MYREPO=$2
    
    usage() {
       echo "Usage:"
       echo "$0 <upstream-remote> <target-remote>"
       echo ""
       echo "Example which ensures remote named 'maxandersen' have all the same branches and tags as 'origin'"
       echo "$0 origin maxandersen"
       exit 1
    }
    
    if [ -z "$UPSTREAM" ]
    then
     echo Missing upstream remote name.
     usage
    fi
    
    if [ -z "$MYREPO" ]
    then
     echo Missing target remote name. 
     usage
    fi
    
    read -p "1. This will setup '$MYREPO' to track all branches in '$UPSTREAM' - Are you sure ?" -n 1 -r
    
    if [[ $REPLY =~ ^[Yy]$ ]]
    then
     for brname in `git branch -r | grep "$UPSTREAM" | grep -v master | grep -v HEAD | sed -e 's/.*\///g'`; do git branch --track $brname  $UPSTREAM/$brname ; done
    fi
    
    read -p "2. This will push all local branches and tags into '$MYREPO' - Are you sure ?" -n 1 -r
    
    if [[ $REPLY =~ ^[Yy]$ ]]
    then
     git push --all $MYREPO
     git push --tags $MYREPO
    fi
    

    Save it as 'updateallbranchestags.sh' and execute it with:

    sh updateallbranches.sh origin maxandersen
    

    And all branches/tags from 'origin' will be made available in remote named 'maxandersen'

    0 讨论(0)
提交回复
热议问题