MySQL Workbench 文件上的 hg diff



我将其作为问答发布,以记录似乎经常出现的问题的解决方法 - 如何将MySQL Workbench文件置于版本控制之下 - 但我无法找到任何解决方案。欢迎反馈!

我怎样才能告诉 Mercurial diff压缩存档的内容并忽略对这些内容的一些更改?具体来说,如何使用hg来比较MySQL工作台(.mwb(文件的内容,而忽略MySQL Workbench每次打开文件时所做的许多不重要的更改?我是否可以使用忽略某些不相关更改的自定义脚本?

背景

我正在尝试在 hg 存储库中diff一个文件。该文件document.mwb.xml是从.mwb文件(MySQL Workbench模型文件(中提取的XML文档。基本上,我希望将模型的内容(表结构、可视化模型等(保持在版本控制之下,但不提交.mwb文件本身,这是一个 zip 存档,因此是一个二进制文件。

每当我保存.mwb文件时,我都会解压缩它。我将解压缩的内容保存在我的存储库中,当我需要在 MySQL 中使用.mwb时,只需再次压缩它们。

有问题的 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例程来忽略这些不相关的更改?

我还没有找到真正的解决方案,但我开发了一个令人满意的解决方法,灵感来自这个 mwb-diff 要点。这允许我解压缩和比较.mwb文件的内容,将这些内容及其更改提交到存储库,并在必要时正常使用这些.mwb

项目结构

我的项目设置如下:

project_root
    /dist
    /schema
    /src
    /test

我将.mwb文件保存为project_root/schema - 称之为MyModel.mwb.显然,您可以使用不同的结构,但您需要相应地修改以下说明。

剧本

我创建了以下脚本并将它们保存在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 ..

让善变的准备摇滚

我们需要告诉hg忽略模型(以及所有其他.mwb文件(。此外,当MySQL Workbench打开时,它会将一个lock文件添加到.mwb存档中,我们需要忽略该文件。因此,请将以下行添加到您的.hgignore文件中:

*.mwb
*.mwb.bak
schema/MyModel/lock

关于data.db文件的旁白

(可选(还要data.db忽略 .mwb文件。它是一个二进制文件,包含任何INSERT或其他 非创建作为模型一部分的 SQL 语句。通常,我 不要将MySQL工作台用于这些东西;我只用它来创建和 编辑表、视图等。因此,我将这一行添加到.hgignore

schema/MyModel/data.db

如果要跟踪对data.db文件的更改,则可能需要 修改此解决方法。

如何使用脚本

如果要修改.mwb文件,请通过运行上述pack.sh从其组件重建该文件。这可以添加为钩子,以便在您hg pull、更新等时自动发生,但我还没有探索过这个。

编辑完.mwb文件并希望提交更改后,请运行unpack.sh脚本。如果需要,您可以在系统上设置一个文件监视实用程序,以便在文件更改时自动执行此操作,但这超出了本答案的范围。

结果

Mercurial 现在非常乐意跟踪对.mwb文件内容的更改,而无需跟踪数千个明显无用的_ptr_属性。此外,当我将其与Mercurial一起使用时,基本逻辑(和shell脚本(将适用于git,SVN等。

重要警告:据我所知,_ptr_属性无关紧要。我上面发布的脚本实际上替换了这些属性的内容。 _ptr_="0x98a7b3e4"(或其他什么(变得_ptr_"xxx".根据我的测试,这并不重要,MySQL Workbench 会很乐意使用重组的文件,显然忽略了_ptr_值。我可能是错的,这些价值观可能很重要!强烈建议您在依赖我的解决方案之前自行测试。

相关内容

  • 没有找到相关文章

最新更新