summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <junkio@cox.net>2005-08-15 00:25:57 (GMT)
committerJunio C Hamano <junkio@cox.net>2005-08-15 10:00:20 (GMT)
commitaae4f42c45704986210ea2a30bd31afba1008275 (patch)
treef77b9d3cc49a55a517d7b09b53c437bc18ac0509
parentd5a63b99835017d2638e55a7e34a35a3c1e80f1f (diff)
downloadgit-aae4f42c45704986210ea2a30bd31afba1008275.zip
git-aae4f42c45704986210ea2a30bd31afba1008275.tar.gz
git-aae4f42c45704986210ea2a30bd31afba1008275.tar.bz2
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>
-rwxr-xr-xgit-clone-script41
1 files changed, 26 insertions, 15 deletions
diff --git a/git-clone-script b/git-clone-script
index 60dc2a9..909ccc5 100755
--- a/git-clone-script
+++ b/git-clone-script
@@ -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=