git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH] Add cheap local clone '-s' flag to git-clone-script

From
Junio C Hamano <junkio@cox.net>
Date
Aug 14, 2005, 08:20 UTC
Message-ID
<7v4q9tdj56.fsf@assigned-by-dhcp.cox.net>

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 depends on the "Alternate object pool mechanism" patch I
    sent out earlier, with a change suggested by Pasky to use
    "$GIT_OBJECT_DIRECTORY/info/alternates" as the file name
    instead of "info/alt".
    This approach has the same danger as symlinking .git/objects
    directory to the original repository that cg-clone mentions
    about its '-l' option, but it is safer and easier to use in
    multi-user environment.  Objects newly created in the cloned
    repository go to the primary object pool of it, not the
    object pool of the original repository.
 git-clone-script |   45 ++++++++++++++++++++++++++++-----------------
 1 files changed, 28 insertions(+), 17 deletions(-)
ffdb36832dd755e65b9adfb68fa6b4a137176bc5
diff --git a/git-clone-script b/git-clone-script
--- 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)
-
-	# 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
+	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
+
+	    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=
Message 1 of 1 in “Add cheap local clone '-s' flag to git-clone-script”
  1. Add cheap local clone '-s' flag to git-clone-scriptJunio C Hamano, Aug 14, 2005

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.