First, pack.packSizeLimit and --max-pack-size didn't use the same base unit which was confusing. They both use MiB now. Also, if the limit was sufficiently low, having a single object written could bust the limit (by design), but caused the remaining allowed size to go negative for subsequent objects, which for an unsigned variable is a rather huge limit. Signed-off-by: Nicolas Pitre <nico@xxxxxxx> --- On Wed, 12 Nov 2008, Jon Nelson wrote: > I'm using 1.6.0.4 and I've found some weird behavior with > pack.packSizeLimit and/or --max-pack-size. > > Initially, I thought I could just use pack.packSizeLimit and set it to > (say) 1 to try to limit the size of individual packfiles to 1MiB or > less. That does not appear to be working. > > In one case I performed the following set of commands: > > # set pack.packSizeLimit to 20 > git config --global pack.packSizeLimit 20 > > # verify that it's 20 > git config --get pack.packSizeLimit # verify it's 20 > > # run gc --prune > git gc --prune > > # show the packfiles > # I find a *single* 65MB packfile, not a series > # of 20MB (or less) packfiles. > ls -la .git/objects/pack/*.pack > > # try repack -ad > git repack -ad > > # I find a *single* 65MB packfile, not a series > # of 20MB (or less) packfiles. > ls -la .git/objects/pack/*.pack > > > So it would appear that the pack.packSizeLimit param > is just being ignored?? > > Then I tested using --max-pack-size explicitly. This works, to a degree. > > git repack -ad --max-pack-size 20 > > # the following shows *4* pack files none larger > # than (about) 20MB > ls -la .git/objects/pack/*.pack > > # try again with 3MB. This also works. > git repack -ad --max-pack-size 3 > find .git/objects/pack -name '*.pack' -size +3M -ls # nothing > > # try again with 1MB. This does NOT work. > git repack -ad --max-pack-size 1 > > # here, I find a *single* 65MB pack file again: > find .git/objects/pack -name '*.pack' -size +1M -ls > > Am I doing something completely wrong with pack.packSizeLimit? > What is going on with --max-pack-size in the 1MB case? Does this fix it for you? diff --git a/Documentation/config.txt b/Documentation/config.txt index 32dcd64..e7808b8 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt @@ -1036,9 +1036,9 @@ you can use linkgit:git-index-pack[1] on the *.pack file to regenerate the `{asterisk}.idx` file. pack.packSizeLimit:: - The default maximum size of a pack. This setting only affects - packing to a file, i.e. the git:// protocol is unaffected. It - can be overridden by the `\--max-pack-size` option of + The default maximum size of a pack, expressed in MiB. This + setting only affects packing to a file, i.e. the git:// protocol is + unaffected. It can be overridden by the `\--max-pack-size` option of linkgit:git-repack[1]. pager.<cmd>:: diff --git a/builtin-pack-objects.c b/builtin-pack-objects.c index 0c4649c..fdee9c6 100644 --- a/builtin-pack-objects.c +++ b/builtin-pack-objects.c @@ -245,8 +245,12 @@ static unsigned long write_object(struct sha1file *f, type = entry->type; /* write limit if limited packsize and not first object */ - limit = pack_size_limit && nr_written ? - pack_size_limit - write_offset : 0; + if (!pack_size_limit || !nr_written) + limit = 0; + else if (pack_size_limit <= write_offset) + limit = 1; + else + limit = pack_size_limit - write_offset; if (!entry->delta) usable_delta = 0; /* no delta */ @@ -1844,7 +1848,7 @@ static int git_pack_config(const char *k, const char *v, void *cb) return 0; } if (!strcmp(k, "pack.packsizelimit")) { - pack_size_limit_cfg = git_config_ulong(k, v); + pack_size_limit_cfg = git_config_ulong(k, v) * 1024 * 1024; return 0; } return git_default_config(k, v, cb); -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html