Подтвердить что ты не робот

Контролируемые версиями файлы (docx, odt)

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

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

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

Это выполнимо? Является ли это выполнимым с помощью меркуриального?

UPDATE:

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

> 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>
4b9b3361

Ответ 1

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

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

Решение этой проблемы - это то, что я хотел сделать сам, поэтому, пожалуйста, сообщите, отправив письмо в Mercurial listing list.

Ответ 2

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

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

Ответ 3

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

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


UPDATE (извините за предоставление ответа начального уровня пользователю 1k-rep)

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

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

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

Ответ 4

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

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

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

https://bitbucket.org/htilabs/ooxmlunpack

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

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

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

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

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