Может ли git обрабатывать zip-файлы как каталоги и файлы внутри zip как большие двоичные объекты?


сценарий

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

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

почему это реально

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

что я хочу!--11-->

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

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

  • гораздо меньший размер РЕПО, т. е. быстрее передача / резервное копирование
  • Отображение изменений с Git на zip будет автоматически работать

6 53

6 ответов:

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

Если вы не хотите менять базу кода (хотя это вроде классная идея у вас есть), вы также можете написать его для себя с помощью pre-commit и post-checkout крючки распаковать и сохраните файлы, а затем верните их в свои .zip состояние на кассе. Вам придется ограничить действия только теми файлами blobs / indexes, которые указаны git add.

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

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

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

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

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

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

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

Zippey git file фильтр

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

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

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

результатом является фактическое РЕПО git, которое может прочитать обычная команда Git.

я подробно расскажу, как bup отличается от Git в "Git с большими файлами".


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

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

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

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

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

что он делает, используя "распаковать-c-A имя файла" для преобразования ваш zip-файл в текст ASCII (unzip-c распаковывается в STDOUT). Следующая вещь-это создание / изменение репозитория файлов/.gitattributes и добавить следующее

*.pptx diff=zip

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

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

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

есть также ZFS для Windows и Linux:

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

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

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

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