мерзавец: не могу найти blob - хочешь избавиться от него из пакета - PullRequest
12 голосов
/ 15 сентября 2011

У меня есть большая капля, от которой я хочу избавиться! Я думал, что удалил файл, используя это решение: http://dound.com/2009/04/git-forever-remove-files-or-folders-from-history/ (Я использовал -- --all вместо HEAD, чтобы файлы удалялись из всех веток)

rm -rf .git/refs/original/ && git reflog expire --all &&  
    git gc --aggressive --prune

Я посмотрел в папке пакета через это Почему мой репозиторий Git такой большой?

$ git verify-pack -v .git/objects/pack/pack-*.idx | sort -k3n
... last 4 lines:
bc7ae9801052180b283cd81880753549f0f92587 blob   19464809 749446 305054873
acd5f09a35846bec25ebc324738139e5caabc50f blob   294278199 71381636 39607483
986d152935434b56cf182d8a32e24cb57af75ac3 blob   480385718 108184804 110989119
ba9d1d27ee64154146b37dfaf42ededecea847e1 blob   761172819 27430741 277589990

Сценарий git-find-blob взят из Какой коммит имеет этот BLOB-объект?

$ ./git-find-blob ba9d1d27ee64154146b37dfaf42ededecea847e1

Но ничего не находит.

Есть идеи, как избавиться от него из моего хранилища?

Ответы [ 5 ]

7 голосов
/ 21 сентября 2011

Вы можете использовать git repack -Ad, чтобы заставить git реконструировать ваши пакеты и распаковать все недоступные объекты в незакрепленные объекты.На этом этапе вы можете использовать git gc --prune=now для удаления недоступных объектов.

Вы также должны проверить, действительно ли истек срок действия ваших повторных журналов.Я считаю, что git reflog expire --all по умолчанию будет 90 дней (или 30 дней для недоступных объектов), поэтому вы можете вместо этого использовать git reflog expire --expire-unreachable=now --all (это необходимо сделать до переупаковки + gc).

2 голосов
/ 02 февраля 2013

Вы хотите использовать BFG Repo-Cleaner , более быструю и простую альтернативу git-filter-branch, предназначенную для удаления больших файлов из репозиториев Git.

Загрузить Java jar (требуется Java 6 или выше) и выполните эту команду:

$ java -jar bfg.jar  --strip-blobs-bigger-than 20M  my-repo.git

Любой BLOB-объект размером более 20 МБ (которого нет в последней commit) будет полностью удален из истории вашего репозитория.Затем вы можете использовать git gc для удаления мертвых данных:

$ git gc --prune=now --aggressive

BFG обычно в 10-50 раз быстрее, чем выполнение git-filter-branch, и параметры настраиваются вокруг этих двух распространенных вариантов использования:

  • Удаление Сумасшедшие большие файлы
  • Удаление Пароли, учетные данные и другие Личные данные

Полное раскрытие: я являюсь автором репо-уборщика BFG.

2 голосов
/ 15 сентября 2011

Во-первых, при вызове git gc вы должны использовать --prune=now, поскольку по умолчанию хранятся объекты, которым менее 2 недель.

Во-вторых, команда git-find-blob, которую вы использовали по умолчанию, ищет в истории только HEAD коммитов, поэтому, если большой двоичный объект находится в другой ветви, этот скрипт пропустит его. Попробуйте вызвать его как:

./git-find-blob ba9d1d27ee64154146b37dfaf42ededecea847e1 --all
1 голос
/ 21 сентября 2011

Капля не появляется на другой стороне чистого толчка, так что это будет мое решение (толкни в новое место, затем клонируй из этого места).Есть ли более простой способ сделать это?

0 голосов
/ 09 октября 2013

Имея ту же проблему. Обнаружен мой проблемный блоб, на который ссылается недоступное дерево. Добавление к сценарию git-find-blob:

git fsck --full --unreachable | \
while read unreachable obj tree
do
    if [[ ! $obj == "tree" ]]; then
        continue
    fi
    if git ls-tree -r $tree | grep -q "$obj_name" ; then
        echo "$unreachable $obj $tree"
    fi
done

Мне удалось удалить BLOB-объект с помощью BFG Repo-Cleaner, но я был бы намного счастливее решить эту проблему с помощью собственных команд git.

...