diff options
Diffstat (limited to 'git-push.sh')
-rwxr-xr-x | git-push.sh | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/git-push.sh b/git-push.sh new file mode 100755 index 0000000000..f10cadbf15 --- /dev/null +++ b/git-push.sh @@ -0,0 +1,87 @@ +#!/bin/sh + +USAGE='[--all] [--tags] [--force] <repository> [<refspec>...]' +. git-sh-setup + +# Parse out parameters and then stop at remote, so that we can +# translate it using .git/branches information +has_all= +has_force= +has_exec= +has_thin=--thin +remote= +do_tags= + +while case "$#" in 0) break ;; esac +do + case "$1" in + --all) + has_all=--all ;; + --tags) + do_tags=yes ;; + --force) + has_force=--force ;; + --exec=*) + has_exec="$1" ;; + --thin) + ;; # noop + --no-thin) + has_thin= ;; + -*) + usage ;; + *) + set x "$@" + shift + break ;; + esac + shift +done +case "$#" in +0) + echo "Where would you want to push today?" + usage ;; +esac + +. git-parse-remote +remote=$(get_remote_url "$@") + +case "$has_all" in +--all) + set x ;; +'') + case "$do_tags,$#" in + yes,1) + set x $(cd "$GIT_DIR/refs" && find tags -type f -print) ;; + yes,*) + set x $(cd "$GIT_DIR/refs" && find tags -type f -print) \ + $(get_remote_refs_for_push "$@") ;; + ,*) + set x $(get_remote_refs_for_push "$@") ;; + esac +esac + +shift ;# away the initial 'x' + +# $# is now 0 if there was no explicit refspec on the command line +# and there was no defalt refspec to push from remotes/ file. +# we will let git-send-pack to do its "matching refs" thing. + +case "$remote" in +git://*) + die "Cannot use READ-ONLY transport to push to $remote" ;; +rsync://*) + die "Pushing with rsync transport is deprecated" ;; +esac + +set x "$remote" "$@"; shift +test "$has_all" && set x "$has_all" "$@" && shift +test "$has_force" && set x "$has_force" "$@" && shift +test "$has_exec" && set x "$has_exec" "$@" && shift +test "$has_thin" && set x "$has_thin" "$@" && shift + +case "$remote" in +http://* | https://*) + exec git-http-push "$@";; +*) + exec git-send-pack "$@";; +esac |