Hi Riaan,
There's a few approach we take when maintaining and sharing files. You can find them below:
Configs such as gscopes.cfg and metamap.cfg
We sometimes symlink all component collection configs to a designated master collection (usually the meta one). However, this approach sometimes lead to changes inadvertently propagating to all collections. i.e. If someone makes a change to the gscope config in a component collection, it will not be obvious to them that the change will also affect other collections.
You could also use a few indexer options to instruct Funnelback to look for the configs in another location.
https://docs.funnelback.com/collections/collection-configuration/indexer_options_collection_cfg.html#d-controlling-metadata-indexing
This has the benefit of being traceable via the collection.cfg
Freemarker Templates
Simple one for this...you can simple use the "import" or "Include" directive which lets you include the contents of other templates.
http://freemarker.org/docs/ref_directive_import.html
http://freemarker.org/docs/ref_directive_include.html
Great for reducing repetition.
Filters and hook scripts
Shared filters and hook scripts can be stored under $SEARCH_HOME/lib/java/groovy. They will then be available to all collections on that server. (Please take note of providing the correct package name)
collections and git
At Funnelback, each collection is its own git repository. This means that if you had 4 collections for a particular project/client, then there will be 4 git repositories. We have it like this so that servers can have any combinations of collections. This is especially useful to us as we are continually migrating collections from various servers. You could add $SEARCH_HOME/conf to git but that would mean that every server needs to have the exact same set of collections. Great if your servers are not multi tenanted (one client, one server).
Hope this helps.
~Gioan