我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
例程来忽略这些无关的更改?
答案 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 ..
我们需要告诉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_
值。 我可能错了,这些价值观可能很重要!我们强烈建议您在依赖我的解决方案之前自行测试。