Re: Split Git

Jan Schneider <[email protected]>
Newsgroups gmane.comp.horde.devel
Message-ID <[email protected]>
Zitat von Michael M Slusarz <[email protected]>:

> Quoting Michael J Rubinsky <[email protected]>:
>
>> Quoting Jan Schneider <[email protected]>:
>>
>>> Zitat von Michael J Rubinsky <[email protected]>:
>>>
>>>> I've been slowly looking into options for development workflows  
>>>> after splitting our repo. I'm convinced we should use  
>>>> git-subtree, but not in the way I think others have suggested.
>>>>
>>>> Gunnar has written an article detailing the use of git-subtree as  
>>>> a way to keep BOTH the monolithic and split repos. There was a  
>>>> short mailing list discussion to go along with thisa. I don't  
>>>> think that this method will work; First of all, this will lead to  
>>>> two different canonical Horde repositories for the same code.  
>>>> That's confusing. Secondly, it is resource intensive. Gunnar's  
>>>> approach utilizes an interim repository that will do the actual  
>>>> split filtering and pushing, but it is s l o w. Third, and  
>>>> perhaps most important, is that published topic branches won't be  
>>>> portable between the two.
>>>>
>>>> Assume the monolithic repo is being used for development - it is  
>>>> impossible to checkout a topic branch of one of the subtrees  
>>>> without git rm'ing the folder, then re adding the subtree's topic  
>>>> branch via git-subtree add. Even with squashing all the commits  
>>>> along the way, this is *messy*. The monolithic's history will be  
>>>> polluted with at least 2 merge commits everytime a branch is  
>>>> changed. Not to mention that the state of the upstream monolithic  
>>>> repository will be inconsistent. There is no telling what branch  
>>>> any of the subtrees are currently on. E.g., if I replace  
>>>> framework/component with a topic branch and the push the  
>>>> monolithic repository without replacing it with master again, the  
>>>> next person who pulls will get a monolithic repository with  
>>>> framework/component's code from the topic branch.
>>>>
>>>> I propose that we only provide our individual repositories  
>>>> publicly. Locally, however, we can utilize git-subtree to build a  
>>>> monolithic repository we can develop against. This repository  
>>>> remains local and is not expected to match the state of any other  
>>>> local repository. This allows us to continue developing with  
>>>> more-or-less the same workflow we utilize now, and utilizing  
>>>> things like our framework_install script (mostly) unchanged. The  
>>>> components script will probably need to be tweaked, since we will  
>>>> obviously be releasing from the discrete repositories.  Dealing  
>>>> with branch changes will still be messy, but the mess will be  
>>>> confined to the local repository and not pushed up to any public  
>>>> monolithic repository.
>>>>
>>>> Of course, helper scripts can be used to lessen the burden of  
>>>> things like changing branches, and split/pushing back to the  
>>>> upstream repositories. I've been cobbling together some ideas in  
>>>> a utility script locally that, among other things, can be used to  
>>>> setup the initial local repository.
>>>>
>>>> Thoughts? I'm sure I'm not the only one who wants to get this  
>>>> moving. Among other reasons, I don't want to work on any BC  
>>>> breaking code until we have this sorted and working.
>>>
>>> What's your reasoning to still have a monolith repo with  
>>> sub-trees, even if only privately, locally? I understand that want  
>>> to keep the workflow as close to the current workflow as possible.  
>>> Though as you already mentioned, this won't work without scripts  
>>> and tools for that anyway.
>>
>> It's not that this won't work without the tools, but rather makes  
>> it easier, by combining a few commands. I do see the point you are  
>> making though (see below).
>>
>>> My question is, what benefit do we have, managing a monolith, or  
>>> container repo repository locally, opposed to having those tools  
>>> and scripts just manage the individual repositories in a local  
>>> container *directory*. I see that being able to git-commit from  
>>> the base directory is a good thing. But if this only works by  
>>> later splitting this commit to the individual repos through tools,  
>>> why not having this tool making the "base" commit right from the  
>>> start? Or is it possible to use the split tools automatically from  
>>> git hooks?
>>
>> Yes, mostly it's to take advantage of git's functionality and our  
>> existing tool set. Not only for git-commit from the base directory,  
>> but things like diff|status|log as well. The latter may be of  
>> dubious value if you choose to always squash the subtree updates,  
>> though on the other hand, this would result in only changes made  
>> locally showing in the log.
>
> I just went through a whole from-the-ground up installation of a dev  
> system while preparing the vagrant image.  These are the lessons I  
> learned:
>
> 1. Our current dev installation process is absolutely terrible.  It  
> took me the better part of **4** hours to try to configure the  
> system to a point where it was usable.  And I'm supposedly a person  
> (as a developer) who has pre-existing knowledge of the process.
>
> It was a humbling/embarrassing experience.
>
> In short: nothing about the current development process, including  
> tools, workflow, etc., should be a factor in deciding how to change  
> the system.
>
> 2. Monolithic repositories are a terrible idea.
>
> And git subtree is not the answer, for a variety of reasons.
>
> (My horror story: it took 6 hours to clone the current repo to a  
> memory card so I can do work on a single library during a flight.   
> There's no need to clone 25,000 files when you are only working on  
> 25).
>
> 3. We have a bunch of different installation utilities living in  
> several different locations.  Very confusing knowing what to use and  
> how to use it.
>
> 4. Composer is going to make this all easier.  Warming up to it  
> quickly (especially after trying to deal with an automated process  
> to install all required PEAR libraries for a given set of  
> applications/libraries).
>
>
> The problem is the idea of trying to structure the git repo in a way  
> where the structure itself defines the development  
> process/environment.  This is the mistake we have done in the past  
> and we can't repeat it again.
>
> VCS is nothing more than a way to store code (and revisions).  *How*  
> the various components interact is something that needs to be done  
> at the environment level.  We can provide tools that create this  
> environment automatically, but that is only one interpretation and  
> an installation is free to do with the components as they wish.
>
>
> My proposed solution:
>
> - All apps and libraries live in separate git repos.  They are all  
> entirely independent of each other.

I think we all agree on this one.

>   - Requires maintenance of a list of git repos, but that is a minor  
> hassle.  (This can be automated via a script on www.horde.org, for  
> example).

Agreed.

> - Installation of code from git repos can be facilitated by a script.
>   - This script can create/clone the git repos as needed.

And update, and diff, and commit, and probably all the major git  
stuff. Wait, why did I argument against sub-tree again? :)

Some extra sugar would be if you could checkout one repo, and have all  
dependent packages' repos checked out too.

>   - All repos will be stored in a base folder
>   - Option to create a separate, web-accessible directory.

Not sure what you mean. Some like what install_dev does today?

> - We combine all installation code that currently exists into a  
> single script.
>   - Includes installation script described above.
>   - Includes stuff in framework/bin
>   - Includes stuff in horde-support/maintenance-tools
>   - Includes the groupware install code (in fact, the  
> Horde_Core_Bundle code is probably a good place to start in terms of  
> creating the install script).
>   - This script can be packaged via PHAR
>   - Benefit: development install script work can be leveraged to  
> make end-user installs better also.
>   - From a technical perspective: the goal would be to create test  
> installations and a developer installation using Vagrant where the  
> provisioning file contains nothing but 'horde-install' commands.

Initially I was like "why mix and match end user and developer  
needs?", but you slowly convince me on that.

> Given the fact that we need to be using Composer ASAP, and that  
> Travis is currently broken/unusable, the priority on this is high.   
> My schedule looks a bit more clear the next week or two, so I can  
> hopefully provide support to help get this done.



-- 
Jan Schneider
The Horde Project
http://www.horde.org/
https://www.facebook.com/hordeproject

-- 
dev mailing list
Frequently Asked Questions: http://wiki.horde.org/FAQ
To unsubscribe, mail: [email protected]
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.