Почему большие файлы все еще существуют в моем пакете, после очистки их с помощью ветки фильтра? - программирование
Подтвердить что ты не робот

Почему большие файлы все еще существуют в моем пакете, после очистки их с помощью ветки фильтра?

Я переписал историю моего репозитория, чтобы удалить некоторые большие FLV файлы, используя git filter-branch. Я прежде всего следовал статье статьи Github о удалении конфиденциальных данных и аналогичных инструкциях, найденных в другом месте в Интернете:

Удаление больших FLV:

git filter-branch --index-filter 'git rm --cached --ignore-unmatch public/video/*.flv' --prune-empty -- --all

Удаление исходных ссылок:

rm -rf .git/refs/original/

Очистка reflog:

git reflog expire --expire=now --all

Обрезка недостижимых объектов:

git gc --prune=now

Агрессивная обрезка недостижимых объектов:

git gc --aggressive --prune=now

Переупаковка:

git repack -A -d

И мой gitdir по-прежнему составляет 205 МБ, содержащийся почти полностью в одном пакете:

$ du -h .git/objects/pack/*
284K    .git/objects/pack/pack-f72ed7cee1206aae9a7a3eaf75741a9137e5a2fe.idx
204M    .git/objects/pack/pack-f72ed7cee1206aae9a7a3eaf75741a9137e5a2fe.pack

Используя этот script, я вижу, что FLV, которые я удалил, все еще содержатся в пакете:

All sizes are in kB's. The pack column is the size of the object, compressed, inside the pack file.
size   pack   SHA                                       location
17503  17416  1be4132fa8d91e6ce5c45caaa2757b7ea87d87b0  public/video/XXX_FINAL.flv
17348  17261  b7aa83e187112a9cfaccae9206fc356798213c06  public/video/YYY_FINAL.flv
....

Клонирование репозитория через git clone --bare my-repo дает my-repo.git, который также имеет размер 205 МБ.

Что я могу сделать, чтобы удалить эти (предположительно) объекты без ссылок из пакета и уменьшить размер моего репозитория до размера, если бы они никогда не были зафиксированы? Если они все еще ссылаются, как-нибудь, есть ли способ сказать, где?

Обновление

При попытке повторного запуска git filter-branch я получил это уведомление:

Cannot create a new backup.
A previous backup already exists in refs/original/
Force overwriting the backup with -f

Я проверил, что в .git/refs/original есть no refs, действительно, каталог вообще не существует. Есть ли другой способ, которым git хранит ссылки, о которых я не знаю?

4b9b3361

Ответ 1

После клонирования новой копии репозитория я смог выполнить команды точно, как указано выше, и достичь желаемого результата: каталог My.git был уменьшен с 205 Мб до 20 МБ, и большие FLV файлы были удалены чисто из файла pack.

Первая попытка была также выполнена на новом клоне, к которому я не вносил никаких изменений, поэтому у меня нет удовлетворительного объяснения того, почему файлы FLV продолжают задерживаться внутри пакета.

Я изначально представил ниже ответ, считая, что я вызвал проблему, выполнив git repack -a перед удалением .git/refs/original, в результате чего исходные ссылки ref упаковываются, так что когда я удалил .git/refs/original, эффекта не было; мои оригинальные ссылки по-прежнему будут ссылаться на большие файлы FLV. Однако это не задерживает. Выполнение приведенных выше команд на недавно клонированной копии репозитория с добавлением git repack -a сразу после git filter-branch, похоже, не влияет на результат - файлы FLV по-прежнему удаляются из файла packfile. У меня нет оснований полагать, что это имеет отношение к исходной проблеме.


Есть ли другой способ, которым git хранит ссылки, о которых я не знаю?

Существует. Оказывается, я не совсем правдивый о порядке команд, перечисленных выше. Я выполнил git repack -a до, работая rm -rf .git/refs/original, а git упаковал refs (будет определено где: сейчас эксперимент). Когда я побежал rm -rf .git/refs/original, ничего не было удалено. git gc не смог сжать мой пакетный файл, потому что у меня все еще оставались ссылки на старые файлы из-за упакованных refs/original ссылок.