git-pull: allow pulling into an empty repository

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>
This commit is contained in:
Linus Torvalds 2006-11-16 11:47:22 -08:00 коммит произвёл Junio C Hamano
Родитель 73fbd33cce
Коммит d09e79cb1c
2 изменённых файлов: 47 добавлений и 2 удалений

Просмотреть файл

@ -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

33
t/t5520-pull.sh Executable file
Просмотреть файл

@ -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