As a human doing both Computer Aided Design (CAD) and some software development, I feel like I always wanted to use Git for version control.
I’ve been working with FreeCAD a lot lately and it seems as the file format is just a renamed .zip. I know that OnShape does a good job at this yet sometimes cloud software can’t be an option and open-source stuff is just great. The goal here is to try using some kind of commit hooks to unzip/zip and leverage Git diffs.
zippey
I discovered this Git filter simple example from 2014 that focuses on (un)zipping .docx files which are apparently using the same compression system.
I created a simple GitForFreeCAD repo, containing:
.gitattributes
zippey.py
BeltA.FCStd
with the first two copied over from the repo, with just a small edit for the .gitattributes file:
*.FCStd filter=zippey
And then running the repo config commands to use this filter
git config filter.zippey.required true
git config filter.zippey.smudge "$PWD/.zippey/zippey.py d"
git config filter.zippey.clean "$PWD/.zippey/zippey.py e"
After making opening the file and making a slight change, we can see the real text-based diff in action!
Note: zippey.py
isn’t part of the repo anymore, it’s to be installed globally at ~/.zippey/zippey.py
# Install zippey
curl -fLo $HOME/.zippey/zippey.py --create-dirs <https://raw.githubusercontent.com/pierremtb/GitForFreeCAD/master/zippey.py>
chmod +x $HOME/.zippey/zippey.py
# Clone without checking out (the folder will look empty)
git clone --no-checkout <https://github.com/pierremtb/GeeXY>
cd GeeXY
# Setup the filter
git config filter.zippey.required true
git config filter.zippey.smudge "$HOME/.zippey/zippey.py d"
git config filter.zippey.clean "$HOME/.zippey/zippey.py e"
# Finally checkout, which will call the .clean function
git checkout --
This hack is pretty smart: git actually detects the binary diffs while you work with the CAD software, so you can see that changes are made on the Source Control of say VS Code, or by running git status
.
And when staging the files for commit (eg. git add BeltA.FCStd
), the scripts run and “smudges” the binary file into a git-readable text file.
When checking out a repo (eg. git pull
), the text files are being “cleaned” back into their FreeCAD-compatible binary format.