繁体   English   中英

MySQL Workbench 文件上的 hg 差异

[英]hg diff on MySQL Workbench files

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

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

背景

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

.mwb我保存.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 gist 这允许我解压缩和比较.mwb文件的内容,将这些内容及其更改提交到存储库,并在必要时正常使用.mwb

项目结构

我的项目是这样设置的:

project_root
    /dist
    /schema
    /src
    /test

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

脚本

我创建了以下脚本并将它们保存在project_root/schema

解压.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

打包文件

#!/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

任选地,也忽略data.db在文件(SQLite数据库) .mwb文件。 它是一个二进制文件,其中包含作为模型一部分的任何INSERT或其他非创建 SQL 语句。 通常,我不使用 MySQL Workbench 来处理这些东西; 我仅使用它来创建和编辑表、视图等。因此,我将此行添加到.hgignore

 schema/MyModel/data.db

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

如何使用脚本

当您想要修改.mwb文件时,请通过运行上面的pack.sh从其组件重建它。 这可以添加为一个钩子,当你hg pull 、 update 等时自动发生,但我还没有探索过这个。

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

结果

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM