Skip to content
Snippets Groups Projects
  • Richard Earnshaw's avatar
    24b17818
    contrib: New remotes structure for vendor and personal refs · 24b17818
    Richard Earnshaw authored
    The initial structure for vendor and personal branches makes use of
    the default remote (normally origin) for the upstream
    repository).  Unfortunately, this causes some confusion, especially for
    personal branches because a push will not push to the correct upstream
    location.  This can be 'fixed' by adding a push refspec for the remote,
    but that has the unfortunate consequence of breaking the push.default
    behaviour for git push, and it becomes too easy to accidentally commit
    something unintended to the main parts of the repository.
    
    To work around this, this patch changes the configuration to use
    separate 'remotes' for these additional refs, with one remote for the
    personal space and another remote for each vendor's space.  The
    personal space is called after the user's preferred branch-space
    prefix (default 'me'), the vendor spaces are called
    vendors/<vendor-name>.
    
    As far as possible, I've made the script automatically restructure any
    existing fetch or push lines that earlier versions of the scripts may
    have created - the gcc-git-customization.sh script will convert all
    vendor refs that it can find, so it is not necessary to re-add any
    vendors you've already added.
    
    You might, however, want to run
      git remote prune <origin>
    after running to clean up any stale upstream-refs that might still be
    in your local repo, and then
      git fetch vendors/<vendor>
    or
      git fetch <me>
    to re-populate the remotes/ structures.
    
    Also, for any branch you already have that tracks a personal or vendor
    branch upstream, you might need to run
      git config branch.<name>.remote <new-remote>
    
    so that merges and pushes go to the right place (I haven't attempted
    to automate this last part).
    
    For vendors, the new structure means that
    
      git checkout -b <vendor>/<branch> remotes/vendors/<vendor>/<branch>
    
    will correctly set up a remote tracking branch.
    
    Please be aware that if you have multiple personal branches set up, then
    
      git push <me>
    
    will still consider all of them for pushing.  If you only want to push
    one branch, then either write
      git push <me> HEAD
    or
      git push <me> <me>/branch
    as appropriate.
    
    And don't forget '-n' (--dry-run) to see what would be done if this
    were not a dry run.
    
    Finally, now that the vendors spaces are isolated from each other and
    from the other spaces, I've added an option "--enable-push" to
    git-fetch-vendor.sh.  If passed, then a "push" spec will be added for
    that vendor to enable pushing to the upstream.  If you re-run the
    script for the same vendor without the option, the push spec will be
    removed.
    
    	* gcc-git-customization.sh: Check that user-supplied remote
    	name exists before continuting.  Use a separate remotes for the
    	personal commit area.  Convert existing personal and vendor
    	fetch rules to new layout.
    	* git-fetch-vendor.sh: New vendor layout.  Add --enable-push
    	option.
    24b17818
    History
    contrib: New remotes structure for vendor and personal refs
    Richard Earnshaw authored
    The initial structure for vendor and personal branches makes use of
    the default remote (normally origin) for the upstream
    repository).  Unfortunately, this causes some confusion, especially for
    personal branches because a push will not push to the correct upstream
    location.  This can be 'fixed' by adding a push refspec for the remote,
    but that has the unfortunate consequence of breaking the push.default
    behaviour for git push, and it becomes too easy to accidentally commit
    something unintended to the main parts of the repository.
    
    To work around this, this patch changes the configuration to use
    separate 'remotes' for these additional refs, with one remote for the
    personal space and another remote for each vendor's space.  The
    personal space is called after the user's preferred branch-space
    prefix (default 'me'), the vendor spaces are called
    vendors/<vendor-name>.
    
    As far as possible, I've made the script automatically restructure any
    existing fetch or push lines that earlier versions of the scripts may
    have created - the gcc-git-customization.sh script will convert all
    vendor refs that it can find, so it is not necessary to re-add any
    vendors you've already added.
    
    You might, however, want to run
      git remote prune <origin>
    after running to clean up any stale upstream-refs that might still be
    in your local repo, and then
      git fetch vendors/<vendor>
    or
      git fetch <me>
    to re-populate the remotes/ structures.
    
    Also, for any branch you already have that tracks a personal or vendor
    branch upstream, you might need to run
      git config branch.<name>.remote <new-remote>
    
    so that merges and pushes go to the right place (I haven't attempted
    to automate this last part).
    
    For vendors, the new structure means that
    
      git checkout -b <vendor>/<branch> remotes/vendors/<vendor>/<branch>
    
    will correctly set up a remote tracking branch.
    
    Please be aware that if you have multiple personal branches set up, then
    
      git push <me>
    
    will still consider all of them for pushing.  If you only want to push
    one branch, then either write
      git push <me> HEAD
    or
      git push <me> <me>/branch
    as appropriate.
    
    And don't forget '-n' (--dry-run) to see what would be done if this
    were not a dry run.
    
    Finally, now that the vendors spaces are isolated from each other and
    from the other spaces, I've added an option "--enable-push" to
    git-fetch-vendor.sh.  If passed, then a "push" spec will be added for
    that vendor to enable pushing to the upstream.  If you re-run the
    script for the same vendor without the option, the push spec will be
    removed.
    
    	* gcc-git-customization.sh: Check that user-supplied remote
    	name exists before continuting.  Use a separate remotes for the
    	personal commit area.  Convert existing personal and vendor
    	fetch rules to new layout.
    	* git-fetch-vendor.sh: New vendor layout.  Add --enable-push
    	option.