Как удалить старые версии медиа-файлов из репозитория git - PullRequest
22 голосов
/ 15 июня 2011

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

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

Ответы [ 5 ]

15 голосов
/ 15 января 2014

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

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

См:
GitHub: удаление конфиденциальных данных
Bitbucket: уменьшить размер репозитория & Bitbucket: поддержка Git-репозитория

Пример удаления файлов размером более 1 мегабайта, а также файлов jpgs, pngs и mp3, отсутствующих в заголовке:

# 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… иначе вы не увидите уменьшения размера. (см. например https://stackoverflow.com/a/28782154/3419541)

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

12 голосов
/ 15 июня 2011

Проверьте раздел «Удаление объектов» в главе Обслуживание и восстановление данных в книге ProGit. Он содержит шаги о том, как удалить объекты из репозитория git. Но имейте в виду, что это разрушительно.

9 голосов
/ 23 мая 2014

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

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

4 голосов
/ 15 июня 2011

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

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

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

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

https://git -scm.com / Docs / ГИТ-подмодуль

https://git -scm.com / книга / а / v2 / GIT-Tools-Подмодули

2 голосов
/ 15 июня 2011

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

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

...