In my current project we have to use a code generator (crazy enough, I know). This code generator is a C# program. I use a MacBook Pro to do my daily work. That means I have to run a VM to use the generator. Annoying. Usually I wiggled my way around doing bigger things with it. When I had to use it, I usually did small things with it, like update some i18n. I could commit and push those changes directly to our central git repository and everything was fine.
Today I had to generate my first bigger code change. Some UI got changed, some entities got their fields removed but I dealt with it they way I was used to. Generate, commit, push. When I checked out the changes in my native system where I do the normal programming, all hell broke loose.
The changes I committed lead to lots of compilation errors. Our Jenkins was complaining and I went into stress mode. It took me two hours to identify the problems and fix them in a way that doesn’t break the code semantics (you don’t want to maintain generated unit tests).
After I restored order, I took a look into how my colleagues, who had generated more often than me, solved that problem. They shared a folder in their VM and copied the generated code around. I didn’t like that because I feel that I don’t have that much control over what happens.
So I did the following:
- I used a Windows share to make the generated folder available on my MacOS system. The path I got was:
- I moved into my local copy of that repository and added that path as an extra remote:
git remote add vm /Volumes/name-of-vm/workspace/my-generated-code-repo
- Now after I generated code in the VM I could just commit it (in the VM of course):
git commit -m 'meaningful message'
- And then I could pull it into my native development environment:
git pull vm master
- Now I could take all the time I needed to correct eventual errors. After that I just pushed it to origin as usual:
git add . && git commit -m 'another meaningful message' && git push
What I wasn’t sure about before was what would happen If I now pull the repository in my VM, but after I did just that it was totally clear to me. The VM commit I pulled into my native environment was – of course – already in the VM. Git is so smart to notice that and just pulls the commit I pushed from my IDE to origin.
Now I have a nice workflow with a commit after I generated new files and a second commit after I edited them.
If you read this and have other nice and/or unusual use cases for git, feel free to drop me a comment.