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:
parent
73fbd33cce
commit
d09e79cb1c
16
git-pull.sh
16
git-pull.sh
@ -44,10 +44,10 @@ do
|
|||||||
shift
|
shift
|
||||||
done
|
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
|
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"
|
if test "$curr_head" != "$orig_head"
|
||||||
then
|
then
|
||||||
# The fetch involved updating the current branch.
|
# The fetch involved updating the current branch.
|
||||||
@ -80,6 +80,11 @@ case "$merge_head" in
|
|||||||
exit 0
|
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`
|
var=`git-repo-config --get pull.octopus`
|
||||||
if test -n "$var"
|
if test -n "$var"
|
||||||
then
|
then
|
||||||
@ -95,6 +100,13 @@ case "$merge_head" in
|
|||||||
;;
|
;;
|
||||||
esac
|
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
|
case "$strategy_args" in
|
||||||
'')
|
'')
|
||||||
strategy_args=$strategy_default_args
|
strategy_args=$strategy_default_args
|
||||||
|
33
t/t5520-pull.sh
Executable file
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
|
||||||
|
|
Loading…
Reference in New Issue
Block a user