Контролируемые версиями файлы (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>
Ответы
Ответ 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 текстовый режим.