+ case "$1" in
+ -a|--a|--ap|--app|--appe|--appen|--append)
+ append=t
+ shift ;;
+ esac
+esac
+remote_nick="$1"
+remote=$(get_remote_url "$@")
+refs=
+rref=
+rsync_slurped_objects=
+
+if test "" = "$append"
+then
+ : >$GIT_DIR/FETCH_HEAD
+fi
+
+append_fetch_head () {
+ head_="$1"
+ remote_="$2"
+ remote_name_="$3"
+ remote_nick_="$4"
+ local_name_="$5"
+
+ # 2.6.11-tree tag would not be happy to be fed to resolve.
+ if git-cat-file commit "$head_" >/dev/null 2>&1
+ then
+ head_=$(git-rev-parse --verify "$head_^0") || exit
+ note_="$head_ $remote_name_ from $remote_nick_"
+ echo "$note_" >>$GIT_DIR/FETCH_HEAD
+ echo >&2 "* committish: $note_"
+ else
+ echo >&2 "* non-commit: $note_"
+ fi
+ if test "$local_name_" != ""
+ then
+ # We are storing the head locally. Make sure that it is
+ # a fast forward (aka "reverse push").
+ fast_forward_local "$local_name_" "$head_" "$remote_" "$remote_name_"
+ fi
+}
+
+fast_forward_local () {
+ case "$1" in
+ refs/tags/*)
+ # Tags need not be pointing at commits so there
+ # is no way to guarantee "fast-forward" anyway.
+ echo "$2" >"$GIT_DIR/$1" ;;
+ refs/heads/*)
+ # NEEDSWORK: use the same cmpxchg protocol here.
+ echo "$2" >"$GIT_DIR/$1.lock"
+ if test -f "$GIT_DIR/$1"