The way I’ve set it up in the past is to have a Library project that is shared with all projects and it is designated to it’s own depot. That Library is managed by an admin, to where nothing can be modified or added unless by the admin. This way, end users are not able to mess up the Library.
When getting from the Depot it is read-only to add an extra layer of protection so end users don’t mess up the local copies either.
Also, user permissions are set on who can actually submit to the Library depot. Note: That was using Perforce, not sure about setting that up in GIT.
All other sub-projects are then symbolic linked to that library using a .BAT file in the content folder. This is because the sym links will not properly store in a repository. So when the sub-project comes down from the depot on a new machine, it needs to have the sym links rebuilt.
If the Library changes, such as a new blueprint or new asset is added, then all users can just get the latest updates for the library and all projects will be updated.
Also, any sub-project specific items or variations, such as a material instance of a Library material, should be duplicated then moved to the sub-project’s content. They will reference the Library asset, but exist with the sub-project.
That way all variations of a Library asset does not bloat up the main Library.
Example:
Library
Content
Library_Materials
Metal_01
Sub-Project
Content
(Symbolic linked) Library_Materials
Metal_01 (create material instance MI_Metal_01)
move to
Sub-Project
Content
Local_Materials
MI_Metal_01