簡體   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