我将其作为问答发布,以记录似乎经常出现的问题的解决方法 - 如何将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_
值。我可能是错的,这些价值观可能很重要!强烈建议您在依赖我的解决方案之前自行测试。