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

Как удалить старые версии медиафайлов из репозитория git

У меня есть репозиторий Git с несколькими огромными медиафайлами (изображениями и аудиофайлами). Несколько версий этих медиафайлов были последовательно отправлены на репо. Файлы являются последовательно уточненными версиями одних и тех же активов, и они имеют одинаковое имя.

Я хочу сохранить только последнюю версию в репозитории Git, потому что она становится слишком большой.
Каков самый простой способ сделать это?
Как правильно передать эти изменения в восходящем репозитории?

4b9b3361

Ответ 1

У меня есть script (github gist здесь), чтобы удалить набор нежелательных папок из всей истории репозитория git или удалить все но последняя версия папки.

Он жестко закодирован, чтобы предположить, что все репозитории git находятся в ~/repos, но это легко изменить. Также необходимо легко адаптироваться к работе с отдельными файлами.

Ответ 2

Старый поток, но в случае, если кто-то еще споткнется здесь...

GitHub и Bitbucket рекомендуют использовать BFG Repo-Cleaner.

См:
GitHub: удалить чувствительные данные
Bitbucket: уменьшить размер репозитория и Bitbucket: поддержка репозитория Git

Пример удаления файлов более 1 мегабайта, а также jpg, png и mp3, которые не находятся в HEAD:

# First get the latest bfg.jar, then:
$ git clone --mirror git://example.com/some-big-repo.git
$ java -jar bfg.jar --strip-blobs-bigger-than 1M --delete-files '*.{jpg,png,mp3}' some-big-repo.git
$ cd some-big-repo.git
$ git reflog expire --expire=now --all && git gc --prune=now --aggressive
$ git push

Примечание: теперь вы нажали обновленные версии, удаленный репозиторий также должен запустить его git gc... иначе вы не увидите уменьшение размера. (см., например, fooobar.com/questions/245130/...)

Наконец, повторите клонирование репозитория, чтобы убедиться, что вы случайно не перезагрузите старые медиафайлы.

Ответ 3

Ознакомьтесь с разделом "Удаление объектов" в главе Обслуживание и восстановление данных в книге ProGit. В нем приводятся инструкции по удалению объектов из репозитория git. Но будьте осторожны, хотя это разрушительно. Кстати, раздел "Удаление объектов" - это последний раздел в книге.

Ответ 4

Как уже упоминалось, вы будете переписывать историю здесь, поэтому вам нужно будет заставить коллабораторов (если есть) сделать git rebase.

Что касается удаления конкретного файла из истории, Github имеет приятное пошаговое руководство.

Для решения, идущего вперёд, вы должны посмотреть, как двоичные файлы помещать в подмодуль.

Git поддержка подмодулей позволяет репозиторию содержать в качестве подкаталога проверку внешнего проекта. Субмодули сохраняют свою личность; поддержка подмодулей просто сохраняет местоположение репозитория подмодуля и идентификатор фиксации, поэтому другие разработчики, которые клонируют содержащий проект ( "суперпроект" ), могут легко клонировать все подмодули в той же ревизии. Возможны частичные проверки суперпроекта: вы можете сказать Git клонировать ни одного, некоторые или все подмодули.

https://git-scm.com/docs/git-submodule

https://git-scm.com/book/en/v2/Git-Tools-Submodules

Ответ 5

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

Это, очевидно, не очень жизнеспособный подход, поэтому урок, вероятно, "не использует git для версии огромных двоичных файлов". Вместо этого вы могли бы иметь отдельную (проигнорированную) папку для файлов и использовать отдельную систему для контроля версий.