Files
git/builtin
Sun Chao 3084a01e5e pack-redundant: new algorithm to find min packs
When calling `git pack-redundant --all`, if there are too many local
packs and too many redundant objects within them, the too deep iteration
of `get_permutations` will exhaust all the resources, and the process of
`git pack-redundant` will be killed.

The following script could create a repository with too many redundant
packs, and running `git pack-redundant --all` in the `test.git` repo
will die soon.

    #!/bin/sh

    repo="$(pwd)/test.git"
    work="$(pwd)/test"
    i=1
    max=199

    if test -d "$repo" || test -d "$work"; then
    	echo >&2 "ERROR: '$repo' or '$work' already exist"
    	exit 1
    fi

    git init -q --bare "$repo"
    git --git-dir="$repo" config gc.auto 0
    git --git-dir="$repo" config transfer.unpackLimit 0
    git clone -q "$repo" "$work" 2>/dev/null

    while :; do
        cd "$work"
        echo "loop $i: $(date +%s)" >$i
        git add $i
        git commit -q -sm "loop $i"
        git push -q origin HEAD:master
        printf "\rCreate pack %4d/%d\t" $i $max
        if test $i -ge $max; then break; fi

        cd "$repo"
        git repack -q
        if test $(($i % 2)) -eq 0; then
            git repack -aq
            pack=$(ls -t $repo/objects/pack/*.pack | head -1)
            touch "${pack%.pack}.keep"
        fi
        i=$((i+1))
    done
    printf "\ndone\n"

To get the `min` unique pack list, we can replace the iteration in
`minimize` function with a new algorithm, and this could solve this
issue:

1. Get the unique and non_uniqe packs, add the unique packs to the
   `min` list.

2. Remove the objects of unique packs from non_unique packs, then each
   object left in the non_unique packs will have at least two copies.

3. Sort the non_unique packs by the objects' size, more objects first,
   and add the first non_unique pack to `min` list.

4. Drop the duplicated objects from other packs in the ordered
   non_unique pack list, and repeat step 3.

Some test cases will fail on Mac OS X. Mark them and will resolve in
later commit.

Original PR and discussions: https://github.com/jiangxin/git/pull/25

Signed-off-by: Sun Chao <sunchao9@huawei.com>
Signed-off-by: Jiang Xin <zhiyou.jx@alibaba-inc.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2019-02-04 14:18:24 -08:00
..
2019-01-04 13:33:33 -08:00
2019-01-04 13:33:34 -08:00
2019-01-04 13:33:33 -08:00
2018-10-19 13:34:02 +09:00
2018-10-19 13:34:02 +09:00
2018-10-19 13:34:02 +09:00
2019-01-04 13:33:33 -08:00
2018-10-16 16:16:02 +09:00
2019-01-04 13:33:32 -08:00
2018-10-26 14:22:13 +09:00
2018-11-13 22:37:27 +09:00
2019-01-04 13:33:33 -08:00
2019-01-04 13:33:33 -08:00
2019-01-04 13:33:33 -08:00
2019-01-04 13:33:33 -08:00
2019-01-04 13:33:33 -08:00
2018-10-19 13:34:02 +09:00
2019-01-04 13:33:33 -08:00
2019-01-04 13:33:33 -08:00
2019-01-04 13:33:31 -08:00
2019-01-04 13:33:31 -08:00
2019-01-04 13:33:33 -08:00
2019-01-04 13:33:33 -08:00
2019-01-04 13:33:33 -08:00
2018-08-29 11:32:49 -07:00
2018-08-27 14:33:43 -07:00