Search code examples
gitgit-branchgit-push

git push to remote, but don't create new branch


Is there a way to git push, but, if the branch doesn't exist in the remote, throw an error or exit non-zero instead of creating a new branch on the server?

The use case is the following. I am creating scripts to help automate the scm workflow in my company. If someone accidentally mistypes a branch name as input into the script, I don't want a new branch created on the remote. I already can manually check remote branch existence, but I wondered if git supports this feature.


Solution

  • No, there is currently not a way to do this with a single call to git-push.


    Possible workarounds:

    Existence of a remote branch can be checked like this:

    #!/bin/bash
    if ! git ls-remote --exit-code $remote /refs/heads/$branch
    then
        echo >&2 "Error: Remote branch does not exist"
        exit 1
    fi
    exit 0
    

    Which could be included in a pre-push hook as well if desired. Something like this (place in .git/hooks/pre-push):

    #!/bin/sh
    remote="$1"
    url="$2"
    while read local_ref local_sha remote_ref remote_sha
    do
      if ! git ls-remote --exit-code $url $remote_ref
      then
        echo >&2 "Remote branch does not exist, not pushing"
        exit 1
      fi
    done
    exit 0
    

    Which will cause the desired behavior:

    $ git push origin master:branch_that_does_not_exist
    Remote branch does not exist, not pushing
    error: failed to push some refs to 'git@github.com:some/repository.git'
    

    If you have access to the server you can also create a pre-recieve hook to reject creation of new branches.