diff options
author | Nguyễn Thái Ngọc Duy <pclouds@gmail.com> | 2012-03-14 21:40:55 +0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2012-03-15 11:29:32 -0700 |
commit | 752661636262ef92f1d69ccd36fd651599805fcc (patch) | |
tree | e58051e3c69cd6d7dd0a31676a2bf4ace40ba20b /revision.c | |
parent | a46034819ecce6872bff099f3d75589f4d38c00c (diff) | |
download | git-nd/optim-connected.tar.gz |
{fetch,receive}-pack: skip sha-1 integrity test on objects from new packnd/optim-connected
When we fetch or push, usually "git rev-list --verify-objects --not
--all --stdin" is used to make sure that all objects between existing
refs and new refs are good. This means no gaps in between, all objects
are well-formed, object content agrees with its sha-1 signature.
For the last one, --verify-objects calls check_sha1_signature() via
parse_object(). check_sha1_signature() is an expensive operation,
especially when new refs are far away from existing ones because all
objects in between are re-hashed. Because objects coming from the new
pack are already hashed by index-pack, we can trust their
integrity. The only objects left to check are existing ones in repo
but has no connection to any current refs.
Pass the new pack id down to--verify-objects and skip
check_sha1_signature() on objects from that pack.
As an (extreme) example, a repository is created with only one commit:
e83c516 (Initial revision of "git", the information manager from hell
- 2005-04-07). The rest of git.git is fetched on top. Without the
patch:
$ time git fetch file:///home/pclouds/w/git/.git
remote: Counting objects: 125656, done.
remote: Compressing objects: 100% (33280/33280), done.
remote: Total 125656 (delta 92585), reused 123464 (delta 90682)
Receiving objects: 100% (125656/125656), 34.60 MiB | 8.47 MiB/s, done.
Resolving deltas: 100% (92585/92585), done.
>From file:///home/pclouds/t/test/
* branch HEAD -> FETCH_HEAD
real 1m30.437s
user 1m31.338s
sys 0m1.687s
With the patch:
$ time git fetch file:///home/pclouds/w/git/.git
remote: Counting objects: 125656, done.
remote: Compressing objects: 100% (33280/33280), done.
remote: Total 125656 (delta 92585), reused 123464 (delta 90682)
Receiving objects: 100% (125656/125656), 34.60 MiB | 7.86 MiB/s, done.
Resolving deltas: 100% (92585/92585), done.
>From file:///home/pclouds/t/test/
* branch HEAD -> FETCH_HEAD
real 0m52.182s
user 0m53.151s
sys 0m1.465s
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'revision.c')
-rw-r--r-- | revision.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/revision.c b/revision.c index 18be62b316..b8aa4c7e15 100644 --- a/revision.c +++ b/revision.c @@ -1438,6 +1438,11 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg revs->tree_objects = 1; revs->blob_objects = 1; revs->verify_objects = 1; + } else if (!strcmp(arg, "--safe-pack")) { + if (strlen(argv[1]) != 40) + die("--safe-pack requires an SHA-1 as pack id, not %s", argv[1]); + strcpy(revs->safe_pack, argv[1]); + return 2; } else if (!strcmp(arg, "--unpacked")) { revs->unpacked = 1; } else if (!prefixcmp(arg, "--unpacked=")) { |