In the company I work for, we have a .Net solution that has over 110 projects.
Up until now, we had the source control managed by SVN server, and we are at the process of transferring it to Git. The solution folder is structured with the projects + a 3rd Party dlls folder (with sub folders), which the projects have references to. (And some are also not referenced, for example C++ dlls that are used by some C# wrappers)
Among of these dlls, you will find, for example, Telerik, etc. Some projects have, for example, reference to some of Telerik's dlls, while other to other dlls. (For example, docking, gridview, ribbonview etc.) Some other folders that exist in the solution folder are "Deployment materials" which consists of an image library, a Help file (currently 110MB) etc, and there is also an "Installation" directory, which contains the install shield scripts and project file, and also the prerequisits.
Up until now, the SVN repo contained all of these, and when we created a new branch, then it would duplicate the entire folder. This way, it was easy to add another feature (since all the needed files are there), and if we wanted to update one of the 3rd party dlls version (For example, Telerik), then we would just paste the new compiled 3rd party dlls instead of the old one and commit the changes.
Since the references to the 3rd party dlls are set to "Specific version = false", then it would work, and when the build machine would export the specific branch from the repository, and it will transparent for the build process from where which branch it was built.
Now, when we are moving to Git, I understand that things are different. The files for the entire solution take ~ 1.5GB (Git repository says that it's 800MB. Maybe it compresses things).
I was thinking of creating a local (will be placed on one of the local servers, or the build machine) Nuget repository, and I've already created Nuget packages for some of the Dlls.
The problems are that:
- If I want to update the 3rd party version, then I need to change it in each project that use it, manually. (Different branches may use different 3rd party versions, since if I will need to create a patch / SP for an old release, then I should to be using the same 3rd party dlls).
- Some of the dlls are c++, I'm not sure how it works with Nuget (Will it try to add them as reference when I add a nuget package to a project?)
- Some of the 3rd parties are Exe files (Some tools that are are also deploying with the software). They are pre-compiled. How do I do that?
As I already mentioned, we also have a "Deployment Materials" folder. What should I do with it? (Put it out side of the Git, and the developers will have to copy it manually if they want to?)
There is also another problem.
The product involves hardware and PC software, and there are 2 teams that work on the software that runs on the hardware itself.
In SVN I had "Externals" taken from the folders of the other teams. Those external files are important and needed for the PC software to work properly. Those externals are updated from time to time.
How do I do that in Git? (The "externals" need to update when it updates in the other gif repo, and I would also be able to edit and push changes to those externals, although this is not a must). I see that there are subtree merges, which tracks changes, but not good for pushing changes back, and submodule which doesn't track changes automatically, but gives the ability to push changes).