1. source code
2. toolchain. there are good reasons for it - we had enromous problems with people using outdated toolchains and fighting with obscure compiler bugs. also just installing new toolchain for everyone will not work - it may have new bugs which are only triggered by old code. bottom line is that toolchain must be in sync with the source and it was a painful lesson. I must add that we have dozens if not hundreds of branches.
3. tests. tests must be in sync with the code, and are branched/merged together. a lot of tests.
4. test results. must be in sync with tests and branched/merged together.
So there you have it.
Other people I know who also have large repsitories are art studios who want to version their artwork - they store raw images.
I'm not entirely satisfied with this approach, since it means a brand new developer has to figure out how to pull all the submodules down when setting up his dev environment.