2012-05-18 2 views
17

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

Удаление большого FLVs:

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

Удаление оригинальные рефов:

расчистке reflog:

git reflog expire --expire=now --all 

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

git gc --prune=now 

Aggressivly обрезку недостижимые объекты:

git gc --aggressive --prune=now 

по упаковке вещей:

git repack -A -d 

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

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

Использование this script, я могу видеть, что FLVs я удалил все еще содержится в упаковке:

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 который также 205MB в размерах.

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

Update

При попытке повторно запустить 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, действительно, каталог не существуют вообще. Есть ли другой способ, которым git хранит ссылки, о которых я не знаю?

+0

Клонирование репозитория с помощью 'git clone --bare my-repo' дает' my-repo.git', который также имеет размер 205 МБ, поэтому нет; пакетный файл и его огромное содержимое поставляются с клоном. – meagar

+0

Ваш удаленный ответ интересен и может быть полезен другим - рассмотрите вопрос о редактировании своего вопроса, чтобы описать реальный порядок команд, которые вы сделали, а затем вернули ответ, объясняющий, что ref ref ref/refs refs упакованы? (Это тонкий момент, что вы можете иметь ссылки, которые существуют только в файлах pack, а не файл под 'refs'.) –

+0

@MarkLongair Я все еще играю, пытаясь воспроизвести результаты моего удаленного ответа. Я клонировал репо и обнаружил, что запуск 'git repack -a' * перед * запуском' rm -rf .git/refs/original' делает ** не **, похоже, влияет на результат. Это не влияет на содержимое '.git/refs/original'. – meagar

ответ

7

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

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

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


Есть другой способ, что Git хранит рефов, что я не знаю о?

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

+0

Что касается упакованных ссылок, см. '.git/упакованные-refs' – twalberg

+4

Не могли бы вы суммировать точные шаги, которые вы в конечном итоге приняли, чтобы, в порядке ответа? У меня есть аналогичная проблема, и я хотел бы попытаться исправить ее. –

 Смежные вопросы

  • Нет связанных вопросов^_^