Re: Problem with large files on different OSes
From: Nicolas Pitre <hidden>
Date: 2016-06-15 22:46:52
On Wed, 27 May 2009, Linus Torvalds wrote:
quoted hunk ↗ jump to hunk
Something like the following may also work, as a more generic "just don't even bother trying to delta huge files". Totally untested. Maybe it works. Maybe it doesn't. Linus --- Documentation/config.txt | 7 +++++++ builtin-pack-objects.c | 9 +++++++++ 2 files changed, 16 insertions(+), 0 deletions(-)diff --git a/Documentation/config.txt b/Documentation/config.txt index 2c03162..8c21027 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt@@ -1238,6 +1238,13 @@ older version of git. If the `{asterisk}.pack` file is smaller than 2 GB, howeve you can use linkgit:git-index-pack[1] on the *.pack file to regenerate the `{asterisk}.idx` file. +pack.packDeltaLimit:: + The default maximum size of objects that we try to delta.
The option name feels a bit wrong here, like if it meant the max number of deltas in a pack. Nothing better comes to my mind at the moment though.
quoted hunk ↗ jump to hunk
diff --git a/builtin-pack-objects.c b/builtin-pack-objects.c index 9742b45..9a0072b 100644 --- a/builtin-pack-objects.c +++ b/builtin-pack-objects.c@@ -85,6 +85,7 @@ static struct progress *progress_state; static int pack_compression_level = Z_DEFAULT_COMPRESSION; static int pack_compression_seen; +static unsigned long pack_delta_limit = 64*1024*1024; static unsigned long delta_cache_size = 0; static unsigned long max_delta_cache_size = 0; static unsigned long cache_max_small_delta_size = 1000;@@ -1270,6 +1271,10 @@ static int try_delta(struct unpacked *trg, struct unpacked *src, if (trg_entry->type != src_entry->type) return -1; + /* If we limit delta generation, don't even bother for larger blobs */ + if (pack_delta_limit && trg_entry->size >= pack_delta_limit) + return -1;
I'd suggest filtering delta candidates out of delta_list up front in prepare_pack() instead. Nicolas