Удаление ветки - это, в общем, правильный ответ.Но здесь есть много маленьких ручек.С некоторыми из них вы можете просто подождать (около месяца) и не связываться с ними.Если вы не хотите ждать, пока различные копии хранилища сжимаются сами по себе:
В этом случае мы уже удалили ветку и возобновили работу над новой веткой., но размер еще не изменился ...
Во-первых, помните, что Git распространяется по своей природе.Каждый репозиторий является (по крайней мере, в принципе) полностью автономным и независимым от любого другого репозитория.Поэтому, когда вы говорите, что репозиторий еще не уменьшился, первый очевидный вопрос звучит так: какой?
Любые изменения, внесенные вами в любой репозиторий, выигралиПо крайней мере, не влияет на любой другой репозиторий, пока вы не соедините их между собой и не скажете одному получать новую работу от другой, или передавать новую работу другому.Если вы делаете все это в тестовом клоне, это нормально, просто помните, что результаты тестового клона будут специфичными для этого одного клона.
Непосредственной следующей проблемой является то, что Git по своей природе 'хочетсделать больше копий всего.Коммиты похожи на некоторые вирусы или болезни: подключите один Git к другому Git, и Git, у которого не было , имеет коммиты, теперь он есть.Git, который имел , имеет коммиты, все еще имеет их.Когда вы, наконец, удалите коммиты, скажем, из шестнадцати клонов, это будет нелепо легко для любого и любого человека, у которого есть коммиты в их клонах, чтобы случайно вновь представить ихисправленные клоны, от которых они распространятся обратно ко всем остальным.Это не значит, что вы не можете избавиться от коммитов - а "1075 * способ , который у вас есть, теперь" только достижим из одной ветви ", теперь все упростит.много, так как вам просто нужно убедиться, что никто не восстанавливает или не объединяет эту ветку из их клона.
Для большого количества полезного фона я рекомендую читать и работать через веб-сайт Думай как (а) Git .После того, как вы переварили то, что есть, способ сжать ваш репозиторий:
Убедитесь, что фиксация (и) с большими файлами недоступна ,В вашем конкретном случае удаление имени ветви дает вам большую часть пути: они были доступны по имени этой ветви и через журналы этой ветви.Удаление ветки также удаляет ее reflogs, так что теперь путь очищен.
Место, из которого эти коммиты (вероятно) все еще могут быть достигнуты, находится в вашем HEAD
reflog.Выполнение git reflog
покажет вам все записи рефлога HEAD
(действие по умолчанию - show
, а показ журнала по умолчанию - для HEAD
).Вы можете выборочно удалить каждую такую запись reflog, например, git reflog delete
, но проще просто удалить все ваши HEAD
записи reflog с помощью:
git reflog expire --expire=now --expire-unreachable=now
Обратите внимание, что этоУдаляет все ваши возможности восстановления, в противном случае случайно потерял HEAD
коммитов, поэтому убедитесь, что вы в порядке с этим, прежде чем сделать это.Вы можете пропустить --expire=now
, так как коммиты на удаленные ветви не должны быть доступны из вашей текущей ветви - здесь я показываю вариант команды "nuke it from orbit".
Затем запустите git gc --prune=now
.Это последний шаг «контрольного списка для сокращения хранилища» из git filter-branch
документации .
Это позаботится обо всех различных элементах, необходимых для перекомпоновки файлов пакета и / или удаления свободных объектов, содержащих большие файлы, которые более недоступны ни по одному внешнему имени.То есть никакое внешнее имя не указывает прямо или косвенно на какой-либо коммит, который через свое дерево или одно из поддеревьев дерева указывает на объект blob, содержащий файл.Таким образом, команда gc
организует другие команды (git repack
и git prune
), которые будут удалять нежелательные объекты.
(Примечание. Если вы используете файлы .keep
для сохранения старых пакетов,вам придется удалить эти .keep
файлы и разрешить уничтожение этих пакетов. Однако, если вы делаете это, вы, вероятно, вообще не задаете этот вопрос.)