builtin/clone.c: add --reject-shallow option

In some scenarios, users may want more history than the repository
offered for cloning, which happens to be a shallow repository, can
give them. But because users don't know it is a shallow repository
until they download it to local, we may want to refuse to clone
this kind of repository, without creating any unnecessary files.

The '--depth=x' option cannot be used as a solution; the source may
be deep enough to give us 'x' commits when cloned, but the user may
later need to deepen the history to arbitrary depth.

Teach '--reject-shallow' option to "git clone" to abort as soon as
we find out that we are cloning from a shallow repository.

Signed-off-by: Li Linchao <lilinchao@oschina.cn>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Li Linchao
2021-04-01 10:46:59 +00:00
committed by Junio C Hamano
parent 84d06cdc06
commit 4fe788b1b0
10 changed files with 108 additions and 6 deletions

View File

@ -11,7 +11,8 @@ test_expect_success 'setup' '
mkdir parent &&
(cd parent && git init &&
echo one >file && git add file &&
git commit -m one)
git commit -m one) &&
git clone --depth=1 --no-local parent shallow-repo
'
@ -45,6 +46,30 @@ test_expect_success 'disallows --bare with --separate-git-dir' '
'
test_expect_success 'reject cloning shallow repository' '
test_when_finished "rm -rf repo" &&
test_must_fail git clone --reject-shallow shallow-repo out 2>err &&
test_i18ngrep -e "source repository is shallow, reject to clone." err &&
git clone --no-reject-shallow shallow-repo repo
'
test_expect_success 'reject cloning non-local shallow repository' '
test_when_finished "rm -rf repo" &&
test_must_fail git clone --reject-shallow --no-local shallow-repo out 2>err &&
test_i18ngrep -e "source repository is shallow, reject to clone." err &&
git clone --no-reject-shallow --no-local shallow-repo repo
'
test_expect_success 'succeed cloning normal repository' '
test_when_finished "rm -rf chilad1 child2 child3 child4 " &&
git clone --reject-shallow parent child1 &&
git clone --reject-shallow --no-local parent child2 &&
git clone --no-reject-shallow parent child3 &&
git clone --no-reject-shallow --no-local parent child4
'
test_expect_success 'uses "origin" for default remote name' '
git clone parent clone-default-origin &&