Как уменьшить размер удаленного репо, удалив ветвь с большими размерами? - PullRequest
0 голосов
/ 06 декабря 2018

В нашем git-репо одна из веток содержит двоичные файлы, которые были зафиксированы и отправлены в удаленное репо для тестирования, однако это привело к непреднамеренным последствиям заполнения размера нашего репо.После некоторых исследований здесь и здесь , а затем некоторых, предоставляется ряд сценариев, в которых решения сильно различаются.Мне интересно, если у нас есть более простой сценарий, который избегает "git push --all --force" (который требует большей координации), которым мы можем воспользоваться.

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

Из исследования были вызваны следующие решения:

Однако они предполагаютчто читатель хочет сохранить историю и, таким образом, удалить поврежденные двоичные файлы, переписать историю и / или что проблема все еще локализована в локальном хранилище.Если проблема удаленная, необходимо исправить локальную проблему, а затем нажать --all для удаленной.

В этом случае мы уже удалили ветку и возобновили работу над новой веткой, но размер не изменился.еще не изменилось, что еще нам нужно сделать?Существует ли более простое решение, поскольку данные локализуются в удаленной ветви, и ветке разрешается удалять?Мы также не уверены, что git каким-то образом сохранит двоичные файлы, чтобы сохранить ссылки на них в других частях истории.Требуется ли сборка мусора на удаленном сервере?обрезка ссылок?

1 Ответ

0 голосов
/ 06 декабря 2018

Удаление ветки - это, в общем, правильный ответ.Но здесь есть много маленьких ручек.С некоторыми из них вы можете просто подождать (около месяца) и не связываться с ними.Если вы не хотите ждать, пока различные копии хранилища сжимаются сами по себе:

В этом случае мы уже удалили ветку и возобновили работу над новой веткой., но размер еще не изменился ...

Во-первых, помните, что 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 файлы и разрешить уничтожение этих пакетов. Однако, если вы делаете это, вы, вероятно, вообще не задаете этот вопрос.)

...