Is this really an internal exception?  If the caller gave us a tag name that we won't accept as a reference name that is rather different than us encountering a form of repository corruption they cannot recover from easily.  The caller just needs to correct their input.

I'm thinking about the EGit UI case here.  If the UI just passes through the tag name entered by the user, runs call(), we need to throw something that tells the UI it should backup and let the user correct their input.  But if we got a valid tag name and crash because something goes wrong deep inside of the ObjectInserter, that's a totally different kind of error for the EGit UI to present to the human.