Подтвердить что ты не робот

Git: не могу найти blob - хочу избавиться от него из пакета

У меня большой блоб, от которого я хочу избавиться! Я думал, что я удалил файл, используя это решение: 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

Я просмотрел папку pack через Почему мой репозиторий 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

script git-find-blob взято из Какой фиксатор имеет этот blob?

$ ./git-find-blob ba9d1d27ee64154146b37dfaf42ededecea847e1

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

Любые идеи, как избавиться от него из моего репозитория?

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

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

$ git gc --prune=now --aggressive

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

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

Полное раскрытие: я являюсь автором BFG Repo-Cleaner.

Ответ 3

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

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

./git-find-blob ba9d1d27ee64154146b37dfaf42ededecea847e1 --all

Ответ 4

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

Ответ 5

С той же проблемой. Обнаруженный мой неприятный blob ссылается на недостижимое дерево. Добавление в git-find-blob script:

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.