Subtree split takes the content of one repository and splits it into many smaller ones. This setup might be familiar from Symfony: all modifications go to the symfony/symfony repository then a subtree split service (like this) pushes the changes to the Symfony component repos, like symfony/event-dispatcher or symfony/framework-bundle. This makes it a lot easier to do changes in the Symfony project since one change probably effects more than one component.
Other examples of organizations using a subtree split are PHP-cache and PHP-translation.
When using this service you need to set up your master repository and configure what paths to split into other repositories, called mirror repositories. The mirrors should be considered as read only, thus you should NEVER push anything to them. After you configured your setup, we will create a web hook for the master repository and deploy keys for your mirrors. Whenever you push something to the master we will split the content and push to the appropriate mirrors.
Please read this carefully. The data in your mirror repositories will be overwritten, all changes will be ignored and lost. If your setup is not configured correctly, you may lose data. We do think this is very serious and will help and guide you as much as we can. We cannot take any responsibility for lost data.
This service is developed by Tobias Nyholm. The service is using the split.sh lite by Fabien Potencier.
If you have any comments, questions or feedback feel free to send me a tweet @tobiasnyholm.
Tobias needed to setup a subtree split for PHP-translation. There were some problems doing it for PHP-cache a while back and he wanted a better solution.
Everything "works", there are probably some bugs. But those will be taken care of... later.
The bot is finally up and running. No more problem with users submitting a pull request to your mirror repositories. The friendly bot will kindly ask the contributor to send the pull request to the master repository instead.
Bugs has been fixed and automated security tools show green. We have performed manual code reviews by external developers to verify security and correctness. We are now production ready.
We now use split.sh internally. We also are hosted on AWS Lambda using Bref and Symfony 5.
It is considered bad package design when there are users interested in a specific feature and they have to install loads of other classes to get that feature. Say that you are interested in Symfony's option resolver. Then you want to download only classes related to the option resolver, you do not want the full stack framework.
It is the same idea with PHP-cache. Redis adapter, Memcache adapter, APC adpater are all in separate packages and repositories. But since maintaining lots of repositories are tricky we want to keep all the adapters in one repository and to a subtree split.
Matthias Noback has written a great book about package design. Read about it here.
A master repository is the repository you work with. Like symfony/symfony. All PRs and commits goes to that repo. From the master we do a "git subtree split" to your configured mirrors.
A mirror repository is a read only repository. You use it to create smaller packages on packagist. Much like PHP-cache does. They have all their cache adapters in a separate package.
One should always take security is very seriously. We store all sensitive data encrypted and the source code has been vetted for security vulnerabilities by trusted developers and by automated tools.
Split.sh is a great tool by Fabien Potencier. However, it is not a service. You need to run the commands yourself for every push. A service will help you register hooks and deploy keys and run the split command when needed.
The private version of Split.sh, that is used by Symfony, is awesome. It has a lot of features that this service never will compete with. (At least not in a near future.)
I'm not sure to be honest. It feels scary to open source a service in which people put a lot of trust to and security breaches will be fatal. On the other hand, that is the reason why you should open source something.
The source is not open at the moment.
Do you need anything else? Join us and we can try to support it together.
Of course, let's talk about it and you are free to contribute.
No need to. Just be kind and help others to do open source development.
Just send me a DM on twitter: @tobiasnyholm