> How would the user create the `GitLink` in the first place?

Maybe `ObjectDatabase.CreateGitLink(ObjectId objectId)`, similar to existing `CreateBlob()` and `CreateTree()`? It would just call the ctor, but the public doesn't need to know that.

> I wonder if `TreeDefinition.Add(Submodule module)` would work?

That wouldn't really align with the other `TreeDefinition` APIs, IMO. Perhaps `TreeEntryDefinition.From(Submodule module)`, but that's about as far as I think we'd want to let a high-level concept creep into this low-level API.