MySQL Workbench文件上的hg diff

时间:2015-11-09 17:32:01

标签: xml mercurial diff mysql-workbench hgignore

posting this as a Q&A记录了一个似乎经常出现的问题的解决方法 - 如何将MySQL Workbench文件置于版本控制之下 - 但我无法找到任何问题解决方案。欢迎提供反馈!

如何告诉Mercurial diff压缩存档的内容并忽略对这些内容的一些更改?具体来说,我如何使用hg来区分MySQL Workbench(.mwb)文件的内容,而忽略了MySQL Workbench每次打开文件时所做的许多不重要的更改?我可以使用忽略某些无关更改的自定义脚本吗?

背景

我正在尝试diff hg存储库中的文件。文件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_属性:在这个文件中有数千个属性,并且每次保存文件时每个属性都会更改,即使没有修改任何内容也是如此。结果,存储库可以迅速变得混乱,完全没有意义的变化&#34;到这个文件。

有没有办法使用自定义diff例程来忽略这些无关的更改?

1 个答案:

答案 0 :(得分:2)

我还没有找到真正的解决方案,但我已经开发了一个令人满意的解决方法,受到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或其他内容的二进制文件   非创建SQL语句,它们是模型的一部分。作为一项规则,我   不要使用MySQL Workbench这个东西;我只用它来创建和   编辑表格,视图等。因此,我将此行添加到.hgignore

     
schema/MyModel/data.db
     

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

如何使用脚本

如果要修改.mwb文件,请通过运行上面的pack.sh从其组件重建它。这可以添加为hook,以便在hg pull,更新等时自动发生,但我还没有探究过这个问题。

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

结果

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

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