git-pull: allow pulling into an empty repository
authorLinus Torvalds <torvalds@osdl.org>
Thu, 16 Nov 2006 19:47:22 +0000 (11:47 -0800)
committerJunio C Hamano <junkio@cox.net>
Fri, 17 Nov 2006 07:45:48 +0000 (23:45 -0800)
We used to complain that we cannot merge anything we fetched
with a local branch that does not exist yet.  Just treat the
case as a natural extension of fast forwarding and make the
local branch'es tip point at the same commit we just fetched.
After all an empty repository without an initial commit is an
ancestor of any commit.

[jc: I added a trivial test.  We've become sloppy but we should
 stick to the discipline of covering new behaviour with new
 tests. ]

Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
git-pull.sh
t/t5520-pull.sh [new file with mode: 0755]

index ed04e7d8d8753cc2cdc7d2737228cb58934534f4..e23beb685d15447ac114c58d1795ed15bef88c9d 100755 (executable)
@@ -44,10 +44,10 @@ do
        shift
 done
 
-orig_head=$(git-rev-parse --verify HEAD) || die "Pulling into a black hole?"
+orig_head=$(git-rev-parse --verify HEAD 2>/dev/null)
 git-fetch --update-head-ok --reflog-action=pull "$@" || exit 1
 
-curr_head=$(git-rev-parse --verify HEAD)
+curr_head=$(git-rev-parse --verify HEAD 2>/dev/null)
 if test "$curr_head" != "$orig_head"
 then
        # The fetch involved updating the current branch.
@@ -80,6 +80,11 @@ case "$merge_head" in
        exit 0
        ;;
 ?*' '?*)
+       if test -z "$orig_head"
+       then
+               echo >&2 "Cannot merge multiple branches into empty head"
+               exit 1
+       fi
        var=`git-repo-config --get pull.octopus`
        if test -n "$var"
        then
@@ -95,6 +100,13 @@ case "$merge_head" in
        ;;
 esac
 
+if test -z "$orig_head"
+then
+       git-update-ref -m "initial pull" HEAD $merge_head "" &&
+       git-read-tree --reset -u HEAD || exit 1
+       exit
+fi
+
 case "$strategy_args" in
 '')
        strategy_args=$strategy_default_args
diff --git a/t/t5520-pull.sh b/t/t5520-pull.sh
new file mode 100755 (executable)
index 0000000..f841574
--- /dev/null
@@ -0,0 +1,33 @@
+#!/bin/sh
+
+test_description='pulling into void'
+
+. ./test-lib.sh
+
+D=`pwd`
+
+test_expect_success setup '
+
+       echo file >file &&
+       git add file &&
+       git commit -a -m original
+
+'
+
+test_expect_success 'pulling into void' '
+       mkdir cloned &&
+       cd cloned &&
+       git init-db &&
+       git pull ..
+'
+
+cd "$D"
+
+test_expect_success 'checking the results' '
+       test -f file &&
+       test -f cloned/file &&
+       diff file cloned/file
+'
+
+test_done
+