by Andreas Houben

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: / Volumes / name-of-vm / workspace / my-generated-code-repo /Volumes/name-of-vm/workspace/my-generated-code-repo 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 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' git commit -m 'meaningful message' And then I could pull it into my native development environment: git pull vm master 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 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.