summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xgit-fetch-script34
-rwxr-xr-xgit-pull-script20
2 files changed, 49 insertions, 5 deletions
diff --git a/git-fetch-script b/git-fetch-script
index b581dc4cd6..dd94edeb38 100755
--- a/git-fetch-script
+++ b/git-fetch-script
@@ -7,28 +7,33 @@ _x40="$_x40$_x40$_x40$_x40$_x40$_x40$_x40$_x40"
append=
force=
+update_head_ok=
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
+ ;;
+ -u|--u|--up|--upd|--upda|--updat|--update|--update-|--update-h|\
+ --update-he|--update-hea|--update-head|--update-head-|\
+ --update-head-o|--update-head-ok)
+ update_head_ok=t
;;
*)
break
;;
esac
+ shift
done
case "$#" in
0)
test -f "$GIT_DIR/branches/origin" ||
test -f "$GIT_DIR/remotes/origin" ||
- die "Where do you want to fetch from?"
+ die "Where do you want to fetch from today?"
set origin ;;
esac
@@ -124,6 +129,12 @@ fast_forward_local () {
esac
}
+case "$update_head_ok" in
+'')
+ orig_head=$(cat "$GIT_DIR/HEAD" 2>/dev/null)
+ ;;
+esac
+
for ref in $(get_remote_refs_for_fetch "$@")
do
refs="$refs $ref"
@@ -150,7 +161,7 @@ do
fi
head=$(curl -nsf $curl_extra_args "$remote/$remote_name") &&
expr "$head" : "$_x40\$" >/dev/null ||
- die "Failed to fetch $remote_name from $remote"
+ die "Failed to fetch $remote_name from $remote"
echo Fetching "$remote_name from $remote" using http
git-http-pull -v -a "$head" "$remote/" || exit
;;
@@ -201,3 +212,18 @@ http://* | https://* | rsync://* )
done
;;
esac
+
+# If the original head was empty (i.e. no "master" yet), or
+# if we were told not to worry, we do not have to check.
+case ",$update_head_ok,$orig_head," in
+*,, | t,* )
+ ;;
+*)
+ curr_head=$(cat "$GIT_DIR/HEAD" 2>/dev/null)
+ if test "$curr_head" != "$orig_head"
+ then
+ echo "$orig_head" >$GIT_DIR/HEAD
+ die "Cannot fetch into the current branch."
+ fi
+ ;;
+esac
diff --git a/git-pull-script b/git-pull-script
index 7016fbf943..c31a65ca8c 100755
--- a/git-pull-script
+++ b/git-pull-script
@@ -5,7 +5,25 @@
# Fetch one or more remote refs and merge it/them into the current HEAD.
. git-sh-setup-script || die "Not a git archive"
-git-fetch-script "$@" || exit 1
+
+orig_head=$(cat "$GIT_DIR/HEAD") || die "Pulling into a black hole?"
+git-fetch-script --update-head-ok "$@" || exit 1
+
+curr_head=$(cat "$GIT_DIR/HEAD")
+if test "$curr_head" != "$orig_head"
+then
+ # The fetch involved updating the current branch.
+
+ # The working tree and the index file is still based on the
+ # $orig_head commit, but we are merging into $curr_head.
+ # First update the working tree to match $curr_head.
+
+ echo >&2 "Warning: fetch updated the current branch head."
+ echo >&2 "Warning: fast forwarding your working tree."
+ git-read-tree -u -m "$orig_head" "$curr_head" ||
+ die "You need to first update your working tree."
+fi
+
merge_head=$(sed -e 's/ .*//' "$GIT_DIR"/FETCH_HEAD | tr '\012' ' ')
merge_name=$(sed -e 's/^[0-9a-f]* //' "$GIT_DIR"/FETCH_HEAD |
tr '\012' ' ')