Code

Add cheap local clone '-s' flag to git-clone-script
authorJunio C Hamano <junkio@cox.net>
Mon, 15 Aug 2005 00:25:57 +0000 (17:25 -0700)
committerJunio C Hamano <junkio@cox.net>
Mon, 15 Aug 2005 10:00:20 +0000 (03:00 -0700)
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>
git-clone-script

index 60dc2a9d8854fd08c708d4a75f1c887d1d724b9f..909ccc530136899eee130f1a29969281f3b878c9 100755 (executable)
@@ -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=