Может ли git обрабатывать zip-файлы как каталоги, а файлы внутри zip-файлов как капли? - PullRequest
60 голосов
/ 04 ноября 2011

Сценарий

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

Если я хочу поместить эти zip-файлы в репозиторий git, каждыйzip рассматривается как большой двоичный объект, поэтому всякий раз, когда я фиксирую репозиторий, размер хранилища увеличивается на размер zip-файла ... даже если изменяется только один небольшой текстовый файл внутри!

Почему это реалистично

MS Word 2007/2010 .docx и Excel .xlsx - это файлы ZIP ...

Что я хочу

Есть,случайно не сказать git, что нужно указывать не zip как файлы, а как каталоги, а их содержимое как файлы?

Преимущества

Но это не можетработаешь, говоришь?

Я понимаю, что без лишних метаданных это приведет к некоторой утратене двусмысленность: на git checkout git должен был бы решить, создавать ли foo.zip/bar.txt как файл в обычном каталоге или как zip-файл.Однако, я думаю, это можно решить с помощью параметров конфигурации.

Две идеи, как это можно сделать (если его еще нет)

  • используя библиотеку, такую ​​как minizip или IO::Compress::Zip внутри git
  • , каким-то образом добавляя слой файловой системы таким образом, чтобы git фактически рассматривал zip-файлы как каталоги, начиная с

Ответы [ 7 ]

21 голосов
/ 04 ноября 2011

Этого не существует, но оно может легко существовать в текущей структуре. Так же, как git действует по-разному при отображении двоичных файлов или файлов ascii при выполнении diff, можно сказать, что он предлагает специальную обработку для определенных типов файлов через интерфейс конфигурации.

Если вы не хотите менять кодовую базу (хотя это крутая идея, которая у вас есть), вы также можете написать ее для себя, используя ловушки до и после проверки , чтобы распаковать и сохранить файлы, а затем вернуть их в состояние .zip при оформлении заказа. Вы должны ограничить действия только теми файлами, BLOB-объектами / индексами, которые определены как git add.

В любом случае это немного работы - вопрос только в том, знают ли другие git-комменты о том, что происходит, и хорошо играют.

12 голосов
/ 18 апреля 2014

Не уверен, если кто-то все еще заинтересован в этом вопросе.Я сталкиваюсь с теми же проблемами, и вот мое решение, которое использует фильтр файлов git.

Редактировать: Во-первых, я не могу заявить, что это ясно, но это IS ответ на вопрос ОП!Прочитайте все предложение, прежде чем комментировать.Кроме того, спасибо @Toon Krijthe за совет, чтобы уточнить решение на месте.

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

Текстовый файл состоит из записей, каждая из которых представляет файлв молнии.Таким образом, вы можете считать этот текстовый файл текстовым изображением для оригинального почтового индекса.Если файл в zip-файле представляет собой текст на деле, он копируется в текстовый файл;в противном случае он кодируется в base64 перед копированием в файл текстового формата.Это сохраняет текстовый файл всегда текстовым файлом.

Хотя этот фильтр не делает каждый файл в zip-объекте большим двоичным объектом, текстовый файл отображается строка за строкой, которая является единицей разницы, в то время как изменения двоичных файлов могут быть представлены обновлениями соответствующих им base64,Я думаю, что это эквивалентно тому, что воображает ОП.

Для получения подробной информации и кода для создания прототипа вы можете прочитать следующую ссылку:

Фильтр файлов Zippey Git

Также, спасибо за место, которое меня вдохновилооб этом решении: Описание работы фильтра файлов

11 голосов
/ 21 ноября 2013

Использование bup (подробно описано в GitMinutes # 24 )

Это единственная подобная git система, предназначенная для работы сбольшие (даже очень очень большие) файлы, что означает, что каждая версия zip-файла будет только увеличивать репо из своей дельты (вместо полной дополнительной копии)

Результатом является фактическийgit repo, которую может читать обычная команда Git.

Я подробно рассказываю, чем bup отличается от Git в " git с большими файлами ".


Любой другой обходной путь (например, git-annex) не является полностью удовлетворительным, как описано в "git-annex с большими файлами ".

5 голосов
/ 28 ноября 2013

http://tante.cc/2010/06/23/managing-zip-based-file-formats-in-git/

(Примечание: за комментарий от Рубен речь идет только о получении правильной разницы, а не о фиксации разархивированных файлов.)

Откройте файл ~ / .gitconfig (создайте, если он еще не существует) и добавьте следующий раздел:

[diff "zip"] textconv = unzip -c -a

Что он делаетиспользует «unzip -c -a FILENAME» для преобразования вашего zip-файла в текст ASCII (unzip -c unzips в STDOUT).Затем создайте / измените файл REPOSITORY / .gitattributes и добавьте следующий

*. Pptx diff = zip

, который говорит git использовать описание zip-diffing из конфигурации для файловmathcing заданной маски (в этом случае все заканчивается .pptx).Теперь git diff автоматически распаковывает файлы и передает вывод ASCII, что немного лучше, чем просто «двоичные файлы отличаются».С другой стороны, к запутанному беспорядку, который представляет собой соответствующий XML-файл pptx, это не очень помогает, но для ZIP-файлов, включая текст (например, архивы исходного кода), это на самом деле очень удобно.

2 голосов
/ 28 февраля 2019

Rezip , аналогично Zippey от sippey , позволяет обрабатывать ZIP-файлы с помощью git.

Как это работает

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

Преимущества

Основное преимущество Rezip перед Zippey заключается в том, что фактический файл, хранящийся в хранилище, все ещеZIP-файл.Таким образом, во многих случаях он все равно будет работать как есть с соответствующим приложением (например, Open Office), даже если оно получено без прохождения через фильтр переупаковки со сжатием.

Как использовать

Установите фильтры в вашей системе:

mkdir -p ~/bin
cd ~/bin

# Download the filer executable
wget https://github.com/costerwi/rezip/blob/master/Rezip.class

# Install the add/commit filter
git config --global --replace-all filter.rezip.clean "java -cp ~/bin Rezip --store"

# (optionally) Install the checkout filter
    git config --global --add filter.rezip.smudge "java -cp ~/bin Rezip"

Используйте фильтр в своем хранилище, добавив подобные строки в ваш файл <repo-root>/.gitattributes:

[attr]textual     diff merge text
[attr]rezip       filter=rezip textual

# MS Office
*.docx  rezip
*.xlsx  rezip
*.pptx  rezip
# OpenOffice
*.odt   rezip
*.ods   rezip
*.odp   rezip
# Misc
*.mcdx  rezip
*.slx   rezip

Часть textual такова, что эти файлы фактически отображаются как текстовые файлы в diffs.

2 голосов
/ 04 ноября 2011

Часто возникают проблемы с предварительно заархивированными файлами для приложений, так как они ожидают, что метод сжатия и порядок файлов будут теми, которые они выбрали.Я полагаю, что ODO-файлы открытых офисов имеют эту проблему.

Тем не менее, если вы просто используете any-old-zip в качестве метода для объединения вещей, то вы сможете создать несколько простых псевдонимов, которыеразархивирует и повторно заархивирует когда требуется.Самый последний Msysgit (он же Git для Windows) теперь имеет zip и unzip на стороне кода оболочки, так что вы можете использовать их в псевдонимах.

Проект, над которым я сейчас работаю, использует zips в качестве основной локальной версииcontrol / archive, так что я также пытаюсь получить работающий набор псевдонимов для того, чтобы засосать эти сотни zip-файлов в git (и вывести их снова ;-), чтобы коллеги были довольны.

2 голосов
/ 04 ноября 2011

Я думаю, вам нужно смонтировать zip-файл в файловую систему. Я не использовал его, но рассмотрим FUSE:

http://code.google.com/p/fuse-zip/

Существует также ZFS для Windows и Linux:

http://users.telenet.be/tfautre/softdev/zfs/

...