Browse Source

[PATCH] "git fetch --force".

Just like "git push" can forcibly update a ref to a value that is not
a fast-forward, teach "git fetch" to do so as well.

Signed-off-by: Junio C Hamano <junkio@cox.net>
maint
Junio C Hamano 20 years ago
parent
commit
ae2da40690
  1. 45
      git-fetch-script

45
git-fetch-script

@ -6,19 +6,32 @@ _x40='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]'
_x40="$_x40$_x40$_x40$_x40$_x40$_x40$_x40$_x40" _x40="$_x40$_x40$_x40$_x40$_x40$_x40$_x40$_x40"


append= append=
force=
while case "$#" in 0) break ;; esac
do
case "$1" in
-a|--a|--ap|--app|--appe|--appen|--append)
append=t
shift
;;
-f|--f|--fo|--for|--forc|--force)
force=t
shift
;;
*)
break
;;
esac
done

case "$#" in case "$#" in
0) 0)
test -f "$GIT_DIR/branches/origin" || test -f "$GIT_DIR/branches/origin" ||
test -f "$GIT_DIR/remotes/origin" || test -f "$GIT_DIR/remotes/origin" ||
die "Where do you want to fetch from?" die "Where do you want to fetch from?"
set origin ;; set origin ;;
*)
case "$1" in
-a|--a|--ap|--app|--appe|--appen|--append)
append=t
shift ;;
esac
esac esac

remote_nick="$1" remote_nick="$1"
remote=$(get_remote_url "$@") remote=$(get_remote_url "$@")
refs= refs=
@ -60,7 +73,16 @@ fast_forward_local () {
refs/tags/*) refs/tags/*)
# Tags need not be pointing at commits so there # Tags need not be pointing at commits so there
# is no way to guarantee "fast-forward" anyway. # is no way to guarantee "fast-forward" anyway.
if test -f "$GIT_DIR/$1"
then
echo >&2 "* $1: updating with $4"
echo >&2 " from $3."
else
echo >&2 "* $1: storing $4"
echo >&2 " from $3."
fi
echo "$2" >"$GIT_DIR/$1" ;; echo "$2" >"$GIT_DIR/$1" ;;

refs/heads/*) refs/heads/*)
# NEEDSWORK: use the same cmpxchg protocol here. # NEEDSWORK: use the same cmpxchg protocol here.
echo "$2" >"$GIT_DIR/$1.lock" echo "$2" >"$GIT_DIR/$1.lock"
@ -81,9 +103,16 @@ fast_forward_local () {
false false
;; ;;
esac || { esac || {
mv "$GIT_DIR/$1.lock" "$GIT_DIR/$1.remote"
echo >&2 "* $1: does not fast forward to $4" echo >&2 "* $1: does not fast forward to $4"
echo >&2 " from $3; leaving it in '$1.remote'" case "$force" in
t)
echo >&2 " from $3; forcing update."
;;
*)
mv "$GIT_DIR/$1.lock" "$GIT_DIR/$1.remote"
echo >&2 " from $3; leaving it in '$1.remote'"
;;
esac
} }
else else
echo >&2 "* $1: storing $4" echo >&2 "* $1: storing $4"

Loading…
Cancel
Save