【问题标题】:hg diff on MySQL Workbench filesMySQL Workbench 文件上的 hg diff
【发布时间】:2016-02-10 10:21:19
【问题描述】:

我是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_ 属性:在这个文件中实际上有数千个属性,并且每次保存文件时它们都会更改,即使没有任何修改。因此,存储库很快就会被对该文件完全无意义的“更改”弄得一团糟。

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

【问题讨论】:

    标签: xml mercurial diff mysql-workbench hgignore


    【解决方案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 打开时,它会在 .mwb 存档中添加一个 lock 文件,我们需要忽略它。因此,将这些行添加到您的 .hgignore 文件中:

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

    关于data.db 文件的旁白

    或者,也可以忽略 data.db 文件(一个 SQLite 数据库) .mwb 文件。它是一个二进制文件,包含任何 INSERTs 或其他 非创建属于模型一部分的 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 等。

    重要警告: 据我所知,_ptr_ 属性无关紧要。我在上面发布的脚本实际上替换了这些属性的内容。 _ptr_="0x98a7b3e4"(或其他)变为_ptr_"xxx"。根据我的测试,这无关紧要,MySQL Workbench 将愉快地使用重组文件,显然忽略了_ptr_ 值。 我可能错了,这些值可能很重要!强烈建议您在依赖我的解决方案之前自己测试一下。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 2016-02-06
      • 1970-01-01
      相关资源
      最近更新 更多