Я ищу мнения о том, как обрабатывать большие двоичные файлы, от которых зависит мой исходный код (веб-приложение). В настоящее время мы обсуждаем несколько альтернатив:
- Скопируйте двоичные файлы вручную.
- Pro: Не уверен.
- Против: я категорически против, так как это увеличивает вероятность ошибок при настройке нового сайта / переносе старого. Создает еще одно препятствие, чтобы принять.
- Управляйте ими всеми с помощью Git .
- Pro: Удаляет возможность «забыть» скопировать важный файл
- Противоположность: раздувает хранилище и снижает гибкость управления базой кода, а извлечение, клонирование и т. Д. Займет довольно много времени.
- Отдельные репозитории.
- Pro: извлечение / клонирование исходного кода выполняется быстро, как всегда, и изображения должным образом архивируются в своем собственном хранилище.
- Против: Удаляет простоту наличия единственного репозитория Git в проекте. Это, безусловно, вводит некоторые другие вещи, о которых я не думал.
Что вы думаете об этом?
Также: есть ли у кого-нибудь опыт работы с несколькими Git-репозиториями и управления ими в одном проекте?
Файлы являются изображениями для программы, которая генерирует PDF-файлы с этими файлами. Файлы будут меняться не очень часто (как в годах), но они очень важны для программы. Программа не будет работать без файлов.
Ответы:
Если программа не работает без файлов, кажется, что разбивать их на отдельные репозитории - плохая идея. У нас есть большие тестовые наборы, которые мы разбиваем на отдельные репозитории, но это действительно «вспомогательные» файлы.
Тем не менее, вы можете управлять файлами в отдельном репозитории, а затем использовать их
git-submodule
для встраивания их в ваш проект в разумной форме. Таким образом, у вас все еще будет полная история всего вашего источника, но, насколько я понимаю, у вас будет только одна соответствующая ревизия вашего подмодуля изображений.git-submodule
Средство должно помочь вам сохранить правильную версию кода в соответствии с правильной версией изображения.Вот хорошее введение в подмодули из Git Book.
источник
Недавно я обнаружил git-annex, который я нахожу потрясающим. Он был разработан для эффективного управления большими файлами. Я использую его для своих фото / музыкальных (и т. Д.) Коллекций. Разработка git-приложения очень активна. Содержимое файлов может быть удалено из репозитория Git, Git отслеживает только древовидную иерархию (через символические ссылки). Однако, чтобы получить содержимое файла, необходимо выполнить второй шаг после извлечения / нажатия, например:
Доступно много команд, и на сайте есть отличная документация. Пакет доступен в Debian .
источник
git annex
доступно и для Windows . Если кто-нибудь когда-либо тестировал его в Windows, я хотел бы услышать о его или ее опыте!Еще одно решение, с апреля 2015 года - Git Large File Storage (LFS) (от GitHub).
Он использует git-lfs (см. Git-lfs.github.com ) и тестируется на сервере, поддерживающем его: lfs-test-server :
метаданные можно хранить только в репозитории git и большом файле в другом месте.
источник
lfs-test-server
объявлен не для производственного использования. На самом деле, я работаю на производственном сервере LFS ( github.com/artemkin/git-lfs-server ). Он находится в стадии разработки, но уже исправен, и мы тестируем его на месте.Взгляните на git bup, который является расширением Git для разумного хранения больших двоичных файлов в репозитории Git.
Вы хотели бы иметь его в качестве подмодуля, но вам не придется беспокоиться о том, что хранилище будет трудно обрабатывать. Один из примеров их использования - хранение образов виртуальных машин в Git.
На самом деле я не видел лучшей степени сжатия, но в моих репозиториях нет действительно больших двоичных файлов.
Ваш пробег может варьироваться.
источник
Вы также можете использовать мерзавец . Мне нравится, что это зависит только от стокового Python и
rsync
. Он также поддерживает обычный рабочий процесс Git со следующими понятными командами:Кроме того, вам необходимо зарегистрировать файл .gitfat в своем хранилище и изменить свои .gitattributes, чтобы указать расширения файлов, которыми вы хотите
git fat
управлять.Вы добавляете двоичный файл, используя обычный
git add
, который в свою очередь вызываетgit fat
на основе ваших правил gitattributes.Наконец, у него есть то преимущество, что место, где на самом деле хранятся ваши двоичные файлы, может быть общим для всех репозиториев и пользователей и поддерживает все, что
rsync
делает.ОБНОВЛЕНИЕ: не используйте git-fat, если вы используете мост Git-SVN. Это приведет к удалению двоичных файлов из вашего хранилища Subversion. Однако, если вы используете чистый Git-репозиторий, он прекрасно работает.
источник
Я бы использовал подмодули (как Pat Notz) или два разных репозитория. Если вы слишком часто изменяете ваши двоичные файлы, я постараюсь минимизировать влияние огромного хранилища, очищающего историю:
У меня была очень похожая проблема несколько месяцев назад: ~ 21 ГБ MP3-файлов, неклассифицированных (плохие имена, плохие id3, не знаю, нравится ли мне этот MP3-файл или нет ...) и реплицированных на трех компьютерах.
Я использовал внешний жесткий диск с основным репозиторием Git и клонировал его на каждый компьютер. Затем я начал классифицировать их обычным способом (толкание, вытягивание, объединение ... удаление и переименование много раз).
В итоге у меня было всего ~ 6 ГБ файлов MP3 и ~ 83 ГБ в каталоге .git. Я использовал
git-write-tree
иgit-commit-tree
для создания нового коммита, без предков коммитов, и начал новую ветку, указывающую на этот коммит. «Журнал Git» для этой ветви показал только один коммит.Затем я удалил старую ветку, сохранил только новую ветку, удалил ref-logs и запустил «git prune»: после этого мои папки .git весили всего ~ 6 ГБ ...
Вы можете время от времени «очищать» огромный репозиторий одним и тем же способом: ваш «мерзавец» будет быстрее.
источник
Решение, которое я хотел бы предложить, основано на бесхозных ветвях и небольшом злоупотреблении механизмом тегов, далее именуемым * Бинарное хранилище бесхозных тегов (OTABS).
TL; DR 12-01-2017 Если вы можете использовать GFS от Github или какой-либо другой третьей стороны, во что бы то ни стало, вам следует. Если не можете, тогда читайте дальше. Имейте в виду, это решение является взломом и должно рассматриваться как таковое.
Желательные свойства ОТАБС
git pull
иgit fetch
, в том числеgit fetch --all
, по-прежнему эффективны по пропускной способности , то есть не все большие двоичные файлы извлекаются из удаленного по умолчанию.Нежелательные свойства ОТАБС
git clone
потенциально неэффективным (но не обязательно, в зависимости от вашего использования). При развертывании этого решения вам, возможно, придется посоветовать коллегам использоватьgit clone -b master --single-branch <url>
вместоgit clone
. Это происходит потому, что git clone по умолчанию буквально клонирует весь репозиторий, включая вещи, на которые вы обычно не хотите тратить свою пропускную способность, например нефиксированные коммиты. Взято из SO 4811434 .git fetch <remote> --tags
пропускную способность неэффективной, но не обязательно неэффективной для хранения. Вы всегда можете посоветовать своим коллегам не использовать его.git gc
хитрость для очистки вашего хранилища от любых файлов, которые вам больше не нужны.Добавление бинарных файлов
Прежде чем начать, убедитесь, что вы зафиксировали все свои изменения, ваше рабочее дерево обновлено, а индекс не содержит незафиксированных изменений. Это может быть хорошей идеей - перенести все ваши локальные филиалы на удаленный компьютер (github и т. Д.) На случай, если произойдет какое-либо бедствие.
git checkout --orphan binaryStuff
сделает свое дело. Это создает ветку, которая полностью отключена от любой другой ветви, и первый коммит, который вы сделаете в этой ветке, не будет иметь родителя, что сделает его корневым.git rm --cached * .gitignore
.rm -fr * .gitignore
. Внутренний.git
каталог останется нетронутым, потому что*
подстановочный знак не соответствует ему.git fetch
засорение своего соединения. Вы можете избежать этого, нажав метку вместо ветки. Это все еще может повлиять на пропускную способность вашего коллеги и хранилище файловой системы, если они имеют привычку печататьgit fetch <remote> --tags
, но читайте дальше, чтобы обойти это. Идти вперед иgit tag 1.0.0bin
git push <remote> 1.0.0bin
.git branch -D binaryStuff
. Ваш коммит не будет помечен для сборки мусора, потому что на него1.0.0bin
достаточно пустого тега, указывающего на него .Проверка двоичного файла
git checkout 1.0.0bin -- VeryBigBinary.exe
.1.0.0bin
загруженного тега-сироты , в этом случае вам придется сделать этоgit fetch <remote> 1.0.0bin
заранее.VeryBigBinary.exe
своему мастеру.gitignore
, чтобы никто в вашей команде не загрязнил основную историю проекта двоичным файлом.Полное удаление двоичного файла
Если вы решите полностью удалить VeryBigBinary.exe из локального хранилища, удаленного хранилища и хранилищ вашего коллеги, вы можете просто:
git push <remote> :refs/tags/1.0.0bin
git tag -l | xargs git tag -d && git fetch --tags
. Взято из SO 1841341 с небольшой модификацией.git -c gc.reflogExpire=0 -c gc.reflogExpireUnreachable=0 -c gc.rerereresolved=0 -c gc.rerereunresolved=0 -c gc.pruneExpire=now gc "$@"
, Это также удалит все другие не связанные ссылки. Взято из SO 1904860git clone -b master --single-branch <url>
вместоgit clone
.2.0.0bin
. Если вы беспокоитесь о том, что ваши коллеги печатают,git fetch <remote> --tags
вы можете назвать это снова1.0.0bin
. Это будет гарантировать, что в следующий раз, когда они извлекут все теги, старые1.0.0bin
не будут ссылаться и помечены для последующей сборки мусора (с помощью шага 3). Когда вы пытаетесь перезаписать тег на пульте, вы должны использовать-f
это так:git push -f <remote> <tagname>
Послесловие
OTABS не касается вашего мастера или любых других исходных кодов / веток разработки. Хеши коммитов, вся история и небольшой размер этих веток не затрагиваются. Если вы уже раздули свою историю исходного кода с помощью двоичных файлов, вам придется очистить ее как отдельную часть работы. Этот скрипт может быть полезен.
Подтвердили работу на Windows с помощью git-bash.
Рекомендуется применять набор стандартных трюков, чтобы сделать хранение бинарных файлов более эффективным. Частое выполнение
git gc
(без каких-либо дополнительных аргументов) заставляет git оптимизировать базовое хранилище ваших файлов с помощью двоичных дельт. Однако, если ваши файлы вряд ли останутся похожими на коммит, вы можете вообще отключить бинарные дельты. Кроме того, поскольку нет смысла сжимать уже сжатые или зашифрованные файлы, такие как .zip, .jpg или .crypt, git позволяет отключить сжатие основного хранилища. К сожалению, это параметр «все или ничего», влияющий и на ваш исходный код.Возможно, вы захотите написать сценарий части OTABS, чтобы обеспечить более быстрое использование. В частности, сценарии 2-3 из « Полное удаление двоичных файлов в
update
ловушку git» могут дать убедительную, но, возможно, опасную семантику для git fetch («извлекать и удалять все, что устарело»).Возможно, вы захотите пропустить шаг 4 « Полное удаление двоичных файлов», чтобы сохранить полную историю всех двоичных изменений на удаленном компьютере за счет раздувания центрального хранилища. Локальные хранилища со временем останутся сухими.
В мире Java можно комбинировать это решение с
maven --offline
созданием воспроизводимой автономной сборки, хранящейся полностью в вашем контроле версий (это проще с maven, чем с gradle). В мире Голанга возможно использовать это решение для управления GOPATH вместоgo get
. В мире Python это можно комбинировать с virtualenv для создания автономной среды разработки, не полагаясь на серверы PyPi для каждой сборки с нуля.Если двоичные файлы меняются очень часто, как строят артефакты, это может быть хорошей идеей для сценария решения , которое хранит 5 последних версии артефактов в тегах бесхозных
monday_bin
,tuesday_bin
, ...,friday_bin
, а также сиротые теги для каждого выпуска1.7.8bin
2.0.0bin
и т. д. Вы можетеweekday_bin
ежедневно поворачивать и удалять старые двоичные файлы. Таким образом, вы получаете лучшее из двух миров: вы сохраняете всю историю вашего исходного кода, но только соответствующую историю ваших двоичных зависимостей. Также очень легко получить двоичные файлы для данного тега, не получая весь исходный код со всей его историей: этоgit init && git remote add <name> <url> && git fetch <name> <tag>
следует сделать за вас.источник
git gc
», - перестал читать тут же. Зачем кому-то отказываться от своего последнего ремня безопасности в пользу какого-то взлома?git gc
небезопасен для запуска. Все ваши коммиты будут по умолчанию хранитьсяgit push <remote> 1.0.0bin
-remote: error: GH001: Large files detected. You may want to try Git Large File Storage
. Похоже, что GitHub больше не поддерживает это? Размер рассматриваемого двоичного файла составлял 100 МБ.По моему мнению, если вы, вероятно, будете часто изменять эти большие файлы, или если вы намерены сделать много
git clone
илиgit checkout
, то вам следует серьезно подумать об использовании другого Git-репозитория (или, возможно, другого способа доступа к этим файлам).Но если вы работаете, как мы, и если ваши двоичные файлы не часто модифицируются, то первый клон / извлечение будет долгим, но после этого он должен быть настолько быстрым, насколько вы хотите (учитывая, что ваши пользователи продолжают использовать первый клонированный репозиторий, который они было).
источник
SVN, кажется, обрабатывает двоичные дельты более эффективно, чем Git.
Я должен был выбрать систему управления версиями для документации (файлы JPEG, файлы PDF и файлы .odt). Я только что протестировал добавление файла JPEG и поворот его на 90 градусов четыре раза (чтобы проверить эффективность двоичных дельт). Репозиторий Git вырос на 400%. Репозиторий SVN вырос только на 11%.
Похоже, что SVN намного эффективнее с двоичными файлами.
Поэтому я выбрал Git для исходного кода и SVN для бинарных файлов, таких как документация.
источник
git gc
того, как общий размер хранилища git был уменьшен до 184KB. Затем я изменил один пиксель с белого на черный и зафиксировал это изменение, общий размер репозитория git увеличился до 388 КБ, а послеgit gc
этого размер общего репозитория git был уменьшен до 184 КБ. Это показывает, что git довольно хорош в сжатии и поиске дельт двоичных файлов.git clone --filter
из Git 2.19 + мелкие клоныЭта новая опция может в конечном итоге стать окончательным решением проблемы бинарных файлов, если разработчики Git и GitHub сделают ее достаточно удобной для пользователя (что, вероятно, до сих пор не достигли, например, для подмодулей ).
Он позволяет фактически выбирать только те файлы и каталоги, которые вы хотите для сервера, и был представлен вместе с расширением удаленного протокола.
При этом мы могли бы сначала сделать неглубокое клонирование, а затем автоматизировать, какие двоичные объекты следует выбирать с помощью системы сборки для каждого типа сборки.
Существует даже уже
--filter=blob:limit<size>
который позволяет ограничить максимальный размер капли для выборки.Я представил минимальный подробный пример того, как выглядит эта функция: Как мне клонировать только подкаталог репозитория Git?
источник
Лично я столкнулся с ошибками синхронизации с Git с некоторыми из моих облачных хостов, когда двоичные данные моих веб-приложений оказались выше отметки 3 ГБ . В то время я рассматривал BFT Repo Cleaner , но это было похоже на взлом. С тех пор я начал просто хранить файлы вне сферы действия Git, вместо этого используя специальные инструменты, такие как Amazon S3, для управления файлами, управления версиями и резервного копирования.
Да. Гуго темы в основном управляются таким образом. Это немного круто, но это делает работу.
Мое предложение состоит в том, чтобы выбрать правильный инструмент для работы . Если это для компании, и вы управляете своей кодовой линией на GitHub, заплатите деньги и используйте Git-LFS. В противном случае вы могли бы изучить более креативные варианты, такие как децентрализованное, зашифрованное хранилище файлов с помощью блокчейна .
Дополнительные опции для рассмотрения включают Minio и s3cmd .
источник
Посмотрите на camlistore . На самом деле он не основан на Git, но я считаю его более подходящим для того, что вы должны делать.
источник