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

[PATCH] Short-cut git-fetch-pack while cloning locally.

From
Junio C Hamano <junkio@cox.net>
Date
Jul 5, 2005, 20:17 UTC
Message-ID
<7vekaddn38.fsf_-_@assigned-by-dhcp.cox.net>
In-Reply-To
<Pine.LNX.4.58.0507041443510.3570@g5.osdl.org>
>>>>> "LT" == Linus Torvalds <torvalds@osdl.org> writes:
LT> Well, I'm not working on it, but tested patches...
Prodded by the hint...

------------ The git-fetch-pack command used internally by git-fetch-script which in turn is used by git-clone-script refuses to run if there is no common head. When cloning locally, just copy/link the objects directory to avoid its use, since we know there will not be any common head (the target is empty). It also should be more efficient.

Signed-off-by: Junio C Hamano <junkio@cox.net>
---

*** This is slightly different from the one I sent as a response *** to David's inquiry, in that it uses cp -rl (or just cp -r) *** instead of cpio. Also I added the copyright notices and one *** liner description.

 git-clone-script |   43 +++++++++++++++++++++++++++++++++++++++----
 rev-list.c       |    5 ++++-
 2 files changed, 43 insertions(+), 5 deletions(-)
f33df082e175f7fc717a75e528eab3db1d294576
diff --git a/git-clone-script b/git-clone-script
--- a/git-clone-script
+++ b/git-clone-script
@@ -1,7 +1,42 @@
 #!/bin/sh
+#
+# Copyright (c) 2005, Linus Torvalds
+# Copyright (c) 2005, Junio C Hamano
+# 
+# Clone a repository into a different directory that does not yet exist.
+
 repo="$1"
 dir="$2"
-mkdir $dir || exit 1
-cd $dir
-git-init-db
-git fetch "$repo" && ( git-rev-parse FETCH_HEAD > .git/HEAD )
+mkdir "$dir" &&
+D=$(
+	(cd "$dir" && git-init-db && pwd)
+) || exit 1
+
+# See if repo is a local directory.
+if (
+	cd "$repo/objects" 2>/dev/null
+)
+then
+	# 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
+
+	if ln "$repo/$sample_file" "$D/.git/objects/sample" 2>/dev/null
+	then
+		l=l
+	else
+		l=
+	fi &&
+	rm -f "$D/.git/objects/sample" &&
+
+	cp -r$l "$repo/objects" "$D/.git/" || exit 1
+
+	# FETCH_HEAD is always HEAD because we do not do the
+	# extra parameter to "git fetch".
+	cat "$repo/HEAD" >"$D/.git/FETCH_HEAD"
+	cd "$D"
+else
+	cd "$D" && git fetch "$repo"
+fi && git-rev-parse FETCH_HEAD > .git/HEAD
diff --git a/rev-list.c b/rev-list.c
--- a/rev-list.c
+++ b/rev-list.c
@@ -482,7 +482,10 @@ int main(int argc, char **argv)
 		commit = get_commit_reference(arg, flags);
 		if (!commit)
 			continue;
-		insert_by_date(&list, commit);
+		if (!merge_order)
+			insert_by_date(&list, commit);
+		else
+			commit_list_insert(commit, &list);
 	}
 
 	if (!merge_order) {		
Previous: Linus TorvaldsNext: Linus Torvalds
Message 9 of 14 in “expensive local git clone”
  1. David S. MillerJul 4, 2005
  2. Linus TorvaldsJul 4, 2005
  3. Petr BaudisJul 4, 2005
  4. David S. MillerJul 4, 2005
  5. Junio C HamanoJul 4, 2005
  6. David S. MillerJul 4, 2005
  7. Junio C HamanoJul 4, 2005
  8. Linus TorvaldsJul 4, 2005
  9. Short-cut git-fetch-pack while cloning locally.Junio C Hamano, Jul 5, 2005
  10. Linus TorvaldsJul 6, 2005
  11. Short-circuit git-clone-pack while cloning locally.Junio C Hamano, Jul 6, 2005
  12. Linus TorvaldsJul 6, 2005
  13. Junio C HamanoJul 6, 2005
  14. Short-circuit git-clone-pack while cloning locally (take 2).Junio C Hamano, Jul 6, 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.