Контролируемые версиями заархивированные файлы (docx, odt) - PullRequest
20 голосов
/ 22 сентября 2010

Существуют форматы, которые на самом деле являются замаскированными zip-файлами, например, docx или odt.Если я храню их непосредственно в системе контроля версий, они обрабатываются как двоичные файлы.Моим идеальным решением было бы

  • иметь хук, который создает каталог foo.docx/ для каждого foo.docx файла перед фиксацией, при необходимости распаковывая все файлы
  • , иметь хук, которыйПереопределяет xml-файлы
  • и имеет хук, воссоздающий foo.docx из сохраненных файлов после обновления

Я не хочу, чтобы сами файлы docx контролировались версиями.(Мне известен вопрос , где был предложен другой подход с пользовательским различием.)

Это выполнимо?Это возможно с помощью Mercurial?

ОБНОВЛЕНИЕ:

Я знаю о крючках.Я интересуюсь спецификой.Вот сеанс, чтобы продемонстрировать ожидаемое поведение.

> hg add foo.docx
> hg status
A foo.docx
> hg commit
> # Change foo.docx with external editor
> hg status
M foo.docx
> hg diff
+++ foo.docx/word/document.xml
- <w:t>An idea</w:t>
+ <w:t>A much better idea</w:t>

Ответы [ 4 ]

13 голосов
/ 17 июня 2011

Мне было интересно то же самое, и я только что натолкнулся на расширение / фильтр ZipDoc для Mercurial, который, кажется, делает именно это!

Еще не пробовал, но оновыглядит многообещающе!

5 голосов
/ 24 сентября 2010

Если вы сможете преодолеть препятствие на пути успешного распаковывания и архивирования документов Openoffice, тогда вы сможете использовать систему фильтрации , которую мы имеем в Mercurial.Это позволяет вам преобразовывать файлы при каждом чтении / записи из / в хранилище.

К сожалению, вам придется сделать больше, чем просто распаковать файл foo.docx.Проблема в том, что вам нужно сгенерировать один файл в качестве вывода - так что, возможно, вы можете unzip foo.docx и затем tar сгенерированные файлы.Затем вы создадите версию tarball, которая должна работать, поскольку tarball - это просто несжатое объединение всех отдельных файлов с некоторой метаинформацией.Если подумать, то более простым решением было бы снова сжать распакованный файл foo.docx, но не указывать сжатие.Это должно дать результаты, аналогичные использованию tar.

Я сам хотел бы решить эту проблему, поэтому, пожалуйста, сообщите об этом, отправив письмо на Список рассылки Mercurial .

3 голосов
/ 22 сентября 2010

Вы можете использовать ловушку precommit, чтобы разархивировать, и ловушку обновления, чтобы застегнуть молнию. См. конкретное руководство о том, как использовать крючки.

Будьте осторожны с переименованием. Если вы переименуете foo.docx в bar.docx, ваша ловушка для предварительной фиксации должна будет удалить foo.docx/ и добавить bar.docx/.


ОБНОВЛЕНИЕ (извините за предоставление ответа начального уровня пользователю 1k-rep)

Если вы хотите использовать распакованный docx для основных операций hg, таких как diff (status может работать с упакованным файлом), вам придется использовать расширение. Я думаю, что вы можете использовать такой же подход, как расширение keyword , чтобы обернуть объект репо своим собственным.

Я написал несколько расширений, но не на этом уровне ядра, поэтому не могу предоставить более подробную информацию.

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

0 голосов
/ 10 июня 2014

В последние несколько дней я боролся с этой проблемой и написал небольшую утилиту .NET для извлечения и нормализации файлов Excel таким образом, чтобы их было намного проще хранить в системе контроля версий.Я опубликовал исполняемый файл здесь:

https://bitbucket.org/htilabs/ooxmlunpack/downloads/OoXmlUnpack.exe

.. и источник здесь:

https://bitbucket.org/htilabs/ooxmlunpack

Если есть интерес, яЯ рад сделать это более настраиваемым, но на данный момент вы должны поместить исполняемый файл в папку (например, в корень вашего исходного репозитория), и при запуске он будет:

  • Сканироватьпапка и ее подпапки для любых файлов .xlsx и .xlsm
  • Возьмите копию файла как * .orig
  • Разархивируйте каждый файл и повторно заархивируйте его без сжатия
  • Довольно распечатать все файлы в архиве, которые являются действительными XML
  • Удалить файл calcchain.xml из архива (так как он сильно изменяется и не влияет на содержимое файла)
  • Встроить любые неформатированные текстовые значения (в противном случае они хранятся в справочной таблице, которая вызывает большие изменения во внутреннем XML, если даже одна ячейка изменена)
  • Удалить значения из любых ячеек, которые содержат формулы (так как ониможно просто рассчитать, когда листext открыл)
  • Создать подпапку * .extracted, содержащую извлеченное содержимое архива zip

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

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

В тестах электронная таблица размером 2 МБ «распаковывается» до 21 МБ, но затемМне удалось сохранить пять его версий с небольшими изменениями между ними, в файле ртутных данных объемом 1,9 МБ, и визуализировать различия между версиями, эффективно используя Beyond Compare в текстовом режиме.

...