So today, after updating Visual Studio 2015 to Update 2, I was committing some changes to a project. Nestled amongst my own changes, deleted files, and new files, was a new VS2015 file, AOX3.VC.db (AOX3 is the name of my solution). This file is the new database engine and replaces (I believe) the SDF file. In Update 1 this was an experimental feature, but as of update 2 it’s official:
The new SQLite-based database engine is now being used by default.
I inadvertently added the file to my local git repository and then committed the changes.(I did the same thing on a couple of other projects, and made several more modifications and commits afterward).
The problem is, this file shouldn’t be in git, especially because it is around 150MB !
I only realised I had a problem when I tried to sync to my online (remote) repository, hosted by VSTS – luckily the attempt failed. The Synchronization panel had the following error message:
Failed to push to the remote repository. See the Output window for more details.
The output window had the following details:
Error encountered while pushing to the remote repository: Error while copying content to a stream.
Unable to read data from the transport connection: The connection was closed.
After a bit of googling I found I had to resort to the nuclear option to fix the problem.. deleting the file from the local git commit history.
Here’s what I did:
1. In VS2015 find the first commit that included the file. To do this I went to the Sync panel on the Team Explorer page and found the outgoing commit, then double-clicked it to see the commit details:
2. Note the parent commit ID of the first commit that included the new file (shown above, 645faa8c), then close VS2015.
3. Run a git bash shell in the solution folder. Then use the filter-branch command to delete the file from the last two commits. This required specifying a range of commits from the parent of the first commit all the way up the HEAD (the latest commit). This means noting the parent commit ID of the first commit that included the new file – as shown in the above screenshot. Here’s the git session:
jon@DESKTOP-0J37S2C MINGW64 /c/dev/Projects/Amber/AOX3 (dev_jon) $ git filter-branch --tree-filter 'rm -f AOX3.VC.db' 645faa8c..HEAD Rewrite 2fa87507296744092c2ac8b0c300b8c5973276ef (1/2) (0 seconds passed, remain Rewrite 2917e9beea5ec0f546538345e33bd01586d359fb (2/2) (15 seconds passed, remaining 0 predicted) Ref 'refs/heads/dev_jon' was rewritten
4. Open VS2015 and check the commits.. now the added/modified database file has disappeared from the list of changes:
5. I then edited my .gitignore file and added *.VC.db, then committed this mod and finally checked everything synchronized.. all worked as expected !
I guess the moral of the story is: don’t be flippant when adding new files, especially those you don’t recognize as your own. As the filter-branch documentation states:
This occurs fairly commonly. Someone accidentally commits a huge binary file with a thoughtless git add ., and you want to remove it everywhere.
This thoughtless programmer signing off, time to sleep 😉