Add cheap local clone '-s' flag to git-clone-script

Using the $GIT_OBJECT_DIRECTORY/info/alternates mechanism,
create a new repository that borrows objects from the original
repository when --shared flag is given in addition to --local.

It is worth pointing out that the "cloned" repository depends on
the original repository, so this should be used only when you
can reasonably trust that the original repository would not
disappear without your knowing.

Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Junio C Hamano 2005-08-14 17:25:57 -07:00
parent d5a63b9983
commit aae4f42c45

View File

@ -6,7 +6,7 @@
# Clone a repository into a different directory that does not yet exist.
usage() {
echo >&2 "* git clone [-l] [-q] [-u <upload-pack>] <repo> <dir>"
echo >&2 "* git clone [-l [-s]] [-q] [-u <upload-pack>] <repo> <dir>"
exit 1
}
@ -16,11 +16,14 @@ get_repo_base() {
quiet=
use_local=no
local_shared=no
upload_pack=
while
case "$#,$1" in
0,*) break ;;
*,-l|*,--l|*,--lo|*,--loc|*,--loca|*,--local) use_local=yes ;;
*,-s|*,--s|*,--sh|*,--sha|*,--shar|*,--share|*,--shared)
local_shared=yes ;;
*,-q|*,--quiet) quiet=-q ;;
1,-u|1,--upload-pack) usage ;;
*,-u|*,--upload-pack)
@ -57,22 +60,30 @@ yes,yes)
exit 1
}
# See if we can hardlink and drop "l" if not.
sample_file=$(cd "$repo" && \
find objects -type f -print | sed -e 1q)
case "$local_shared" in
no)
# See if we can hardlink and drop "l" if not.
sample_file=$(cd "$repo" && \
find objects -type f -print | sed -e 1q)
# objects directory should not be empty since we are cloning!
test -f "$repo/$sample_file" || exit
# objects directory should not be empty since we are cloning!
test -f "$repo/$sample_file" || exit
l=
if ln "$repo/$sample_file" "$D/.git/objects/sample" 2>/dev/null
then
l=l
fi &&
rm -f "$D/.git/objects/sample" &&
cd "$repo" &&
find objects -type f -print |
cpio -puamd$l "$D/.git/" || exit 1
l=
if ln "$repo/$sample_file" "$D/.git/objects/sample" 2>/dev/null
then
l=l
fi &&
rm -f "$D/.git/objects/sample" &&
cd "$repo" &&
find objects -type f -print |
cpio -puamd$l "$D/.git/" || exit 1
;;
yes)
mkdir -p "$D/.git/objects/info"
echo "$repo/objects" >"$D/.git/objects/info/alternates"
;;
esac
# Make a duplicate of refs and HEAD pointer
HEAD=