hg diff в файлах MySQL Workbench
Я публикую это как Q&A для документирования обходного пути для проблемы, которая, кажется, часто возникает - как поставить файлы MySQL Workbench под контроль версий - но для которой я не смог найти никаких решений. Обратная связь приветствуется!
Как я могу сказать Mercurial, чтобы diff
содержимое архива zip и игнорировать некоторые изменения этого содержимого? В частности, как я могу использовать hg
чтобы проверить содержимое MySQL Workbench (.mwb
), игнорируя многие несущественные изменения, которые MySQL Workbench вносит при каждом открытии файла? Могу ли я использовать собственный скрипт, который игнорирует некоторые несущественные изменения?
Фон
я пытаюсь diff
файл в репозитории hg. Файл, document.mwb.xml
является XML-документом, извлеченным из .mwb
файл (файл модели MySQL Workbench). По сути, я стараюсь держать содержимое модели - структуру таблицы, визуальную модель и т. Д. - под контролем версий, но не фиксировать .mwb
сам файл, который является zip-архивом и, следовательно, двоичным файлом.
В любое время я сохраняю .mwb
файл, я распаковываю его. Я сохраняю разархивированное содержимое в своем хранилище и просто снова заархивирую его, когда мне нужно работать с .mwb
в MySQL.
Рассматриваемый XML выглядит так:
<?xml version="1.0"?>
<data grt_format="2.0" document_type="MySQL Workbench Model" version="1.4.4">
<value type="object" struct-name="workbench.Document" id="8551CCFA-3AD0-4207-BC76-15ED589CF22C" struct-checksum="0x7131bf99">
<value type="object" struct-name="workbench.logical.Model" id="B48E1CD2-3386-40B7-8E59-AA191598F667" struct-checksum="0xf4220370" key="logicalModel">
<value _ptr_="0x7fbcd1cc3270" type="list" content-type="object" content-struct-name="workbench.logical.Diagram" key="diagrams"/>
<value _ptr_="0x7fbcd1cc3210" type="dict" key="customData"/>
<value _ptr_="0x7fbcd1cc32d0" type="list" content-type="object" content-struct-name="model.Marker" key="markers"/>
<value _ptr_="0x7fbcd1cc3330" type="dict" key="options"/>
<value type="string" key="name"></value>
<link type="object" struct-name="GrtObject" key="owner">8551CCFA-3AD0-4207-BC76-15ED589CF22C</link>
</value>
<value _ptr_="0x7fbcd1cc2b70" type="list" content-type="object" content-struct-name="workbench.OverviewPanel" key="overviewPanels"/>
<value _ptr_="0x7fbcd1cc2c00" type="list" content-type="object" content-struct-name="workbench.physical.Model" key="physicalModels">
<value type="object" struct-name="workbench.physical.Model" id="34B9E967-5C9B-4D1B-8759-C417F6C33AA3" struct-checksum="0x5f896d18">
...
Проблема в том, _ptr_
атрибуты: в этом файле их буквально тысячи, и каждый из них изменяется каждый раз, когда файл сохраняется, даже если ничего не изменяется. В результате, хранилище может быстро загромождаться совершенно бессмысленными "изменениями" в этом файле.
Есть ли способ использовать кастом diff
рутина игнорировать эти несущественные изменения?
1 ответ
Я не нашел истинного решения, но я разработал удовлетворительный обходной путь, вдохновленный этим mwb-diff gist. Это позволяет мне разархивировать и разложить .mwb
содержимого файла, зафиксируйте это содержимое и его изменения в хранилище и используйте .mwb
обычно, когда это необходимо.
Структура проекта
Мой проект настроен так:
project_root
/dist
/schema
/src
/test
Я спасаю .mwb
файл - позвони MyModel.mwb
- в project_root/schema
, Очевидно, что вы можете использовать другую структуру, но вам нужно будет соответствующим образом изменить приведенные ниже инструкции.
Скрипты
Я создал следующие скрипты и сохранил их в project_root/schema
:
unpack.sh
#!/bin/bash
# Unzip the model (MyModel.mwb) into a particular directory (project_root/schema/MyModel)
unzip -o MyModel.mwb -d MyModel/
# Replace all _ptr_="...." attributes with _ptr_="xxx"
sed -i presed -E 's/_ptr_="0x[0-9a-f]+"/_ptr_="xxx"/g' MyModel/document.mwb.xml
pack.sh
#!/bin/bash
# This file goes into the directory containing the model contents, zips them up, and saves them as a .mwb model
cd MyModel/
zip -r ../MyModel.mwb ./* -x lock
cd ..
Подготовка Mercurial к рок-музыке
Нам нужно сказать hg
игнорировать модель (и все остальные .mwb
файлы). Кроме того, когда MySQL Workbench открыт, он добавляет lock
подать в .mwb
архив, который мы должны игнорировать. Итак, добавьте эти строки в ваш .hgignore
файл:
*.mwb
*.mwb.bak
schema/MyModel/lock
В сторону о
data.db
файлПри желании также можно игнорировать
data.db
файл (база данных SQLite) в.mwb
файл. Это двоичный файл, который содержит любыеINSERT
s или другие не создаваемые операторы SQL, которые являются частью вашей модели. Как правило, я не использую MySQL Workbench для этого; Я использую его только для создания и редактирования таблиц, представлений и т. Д. Итак, я добавил эту строку в.hgignore
:schema/MyModel/data.db
Если вы хотите отслеживать изменения в
data.db
файл, возможно, потребуется изменить этот обходной путь.
Как использовать сценарии
Когда вы хотите изменить .mwb
файл, восстановить его из его компонентов, запустив pack.sh
выше. Это может быть добавлено как ловушка, чтобы происходить автоматически, когда вы hg pull
, обновления и т. д., но я еще не исследовал это.
Когда вы закончите редактирование .mwb
файл и хотите зафиксировать ваши изменения, запустите unpack.sh
скрипт. Если вы хотите, вы можете настроить утилиту наблюдения за файлами в своей системе, чтобы она делала это автоматически при изменении файла, но это выходит за рамки этого ответа.
Результаты, достижения
Mercurial теперь очень рад отслеживать изменения в содержании вашего .mwb
файл без отслеживания тысячи явно бесполезных _ptr_
атрибутов. Также, пока я использую это с Mercurial, базовая логика (и сценарии оболочки) будут работать с git, SVN и т. Д.
ВАЖНАЯ ПЕРЕДАЧА: Насколько я могу судить, _ptr_
атрибуты не имеют значения. Сценарии, которые я выложил выше, фактически заменяют содержимое этих атрибутов. _ptr_="0x98a7b3e4"
(или что угодно) становится _ptr_"xxx"
, Основываясь на моем тестировании, это не имеет значения, и MySQL Workbench с удовольствием будет работать с восстановленным файлом, очевидно, игнорируя _ptr_
ценности. Я могу ошибаться, и эти значения могут иметь значение! Вам настоятельно рекомендуется проверить это самостоятельно, прежде чем полагаться на мое решение.