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:

committed by
Junio C Hamano

parent
84d06cdc06
commit
4fe788b1b0
@ -759,6 +759,15 @@ test_expect_success 'partial clone using HTTP' '
|
||||
partial_clone "$HTTPD_DOCUMENT_ROOT_PATH/server" "$HTTPD_URL/smart/server"
|
||||
'
|
||||
|
||||
test_expect_success 'reject cloning shallow repository using HTTP' '
|
||||
test_when_finished "rm -rf repo" &&
|
||||
git clone --bare --no-local --depth=1 src "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" &&
|
||||
test_must_fail git clone --reject-shallow $HTTPD_URL/smart/repo.git repo 2>err &&
|
||||
test_i18ngrep -e "source repository is shallow, reject to clone." err &&
|
||||
|
||||
git clone --no-reject-shallow $HTTPD_URL/smart/repo.git repo
|
||||
'
|
||||
|
||||
# DO NOT add non-httpd-specific tests here, because the last part of this
|
||||
# test script is only executed when httpd is available and enabled.
|
||||
|
||||
|
@ -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 &&
|
||||
|
@ -95,6 +95,31 @@ test_expect_success 'clone -c remote.<remote>.fetch=<refspec> --origin=<name>' '
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test_expect_success 'set up shallow repository' '
|
||||
git clone --depth=1 --no-local . shallow-repo
|
||||
'
|
||||
|
||||
test_expect_success 'clone.rejectshallow=true should reject cloning shallow repo' '
|
||||
test_when_finished "rm -rf out" &&
|
||||
test_must_fail git -c clone.rejectshallow=true clone --no-local shallow-repo out 2>err &&
|
||||
test_i18ngrep -e "source repository is shallow, reject to clone." err &&
|
||||
|
||||
git -c clone.rejectshallow=false clone --no-local shallow-repo out
|
||||
'
|
||||
|
||||
test_expect_success 'option --[no-]reject-shallow override clone.rejectshallow config' '
|
||||
test_when_finished "rm -rf out" &&
|
||||
test_must_fail git -c clone.rejectshallow=false clone --reject-shallow --no-local shallow-repo out 2>err &&
|
||||
test_i18ngrep -e "source repository is shallow, reject to clone." err &&
|
||||
|
||||
git -c clone.rejectshallow=true clone --no-reject-shallow --no-local shallow-repo out
|
||||
'
|
||||
|
||||
test_expect_success 'clone.rejectshallow=true should succeed cloning normal repo' '
|
||||
test_when_finished "rm -rf out" &&
|
||||
git -c clone.rejectshallow=true clone --no-local . out
|
||||
'
|
||||
|
||||
test_expect_success MINGW 'clone -c core.hideDotFiles' '
|
||||
test_commit attributes .gitattributes "" &&
|
||||
rm -rf child &&
|
||||
|
Reference in New Issue
Block a user