26 марта 2012 г. 2:04 пользователь Stas Malyshev
<smalys...@sugarcrm.com> написал:
> Hi!
>
>> There was a discussion recently on IRC that our current git working
>> process is not perfect (especially about keeping one branch-only
>> bugfixes) so that's a
>
> One thing with discussions on IRC is that nobody except those present
> there can neither participate nor know what was talked about. And since
> we have timezone differences and other stuff going on in our lives, that
> means, on my estimate, a substantial percentage of the people here
> wouldn't know anything about what was discussed. Thus, it would be
> useful to explain what exactly is the problem we are talking about.
>

Main problem is that our current workflow doesn't allow branch-only
changes. I.e. if you make a bugfix and want to stay it in PHP-5.3 only
you can't merge 5.3 with 5.4 anymore, otherwise your bugfix will go
there.
After some thinking it seems that GitFlow doesn't solve this problem
since it's based on merging :), so let's postpone its presence here
for a while.
What can we do here:
1) use cherry-picking in one repo. This has big downside (as dsp
pointed) that we can't use git annotate, bisect and other commands
assuming that commit is introduced in repository only once.
2) Simplify code that way so we won't need one-branch only changes,
can't say anything concrete here since I'm not familiar with PHP
internals at all.
We still need a better solution here.


>> If you're not yet familiar what is that, please read
>> his wonderful article   
>> http://nvie.com/posts/a-successful-git-branching-model/
>> another wonderful article about the gitflow tool
>> http://jeffkreeftmeijer.com/2010/why-arent-you-using-git-flow/
>
> This is a nice process, however I'm not sure how it could apply to PHP.
> Could you outline what will be done in this case when we have:
> 1. A bugfix for 5.3

Okay, since I'm not too familiar with release process, assume
following (please, correct me if I'm wrong):
* PHP 5.3 can't have features, only bugfixes
* PHP 5.3 can have bugfixes that are merged upstream (PHP-5.4 and
master) and bugfixes that should stay only in PHP-5.3
* PHP-5.4 and master can have bugfixes and features that are merged
upstream (master) and bugfixes/features that should stay only in
current branch
* All branches are have regular releases

Advantage of git flow is that your development process becomes more
straightforward, you can concentrate on development then on merging
bureaucracy.

In gitflow you have 4 branches:
* master - contains only production ready releases, nobody commits here directly
* develop - main development branch, all work usually is get merged here
* feature/<name> - feature/bugfix branches for separate bugfixes and
features. Merged into develop.
* hotfix/<name> - same that feature branches but is urgent and is
always merged into master *and* develop. For example, when security
release is issued, this fix should go into release and into main
development branch.
* release/<name> - pre-release stability branches, for bug-fixes only.
Merged into develop and master (making a new release). When you have a
release branch, you can't commit into develop (so hotfixes go here
too, if we have release branch).

That's canonical git-flow. We obviously will need several master and
develop branches, since PHP release branches need own development and
can't be merged in each other. That's not yet implemented and needs to
be done in git-flow.

So you want to make a bugfix in 5.3 that will be merged upstream

Make a bugfix in 5.3
$ git flow feature start bugfix PHP-5.3 # create a bugfix branch based on 5.3
<hack> ... <check> ... <test>
$ git add && git commit
$ git flow feature finish -k bugfix 5.3-develop
Bugfix get merged into 5.3-develop - this should be implemented since
gitflow supports only 1 develop branch for now. -k says to keep branch
after finish, since we'll need it to merge upstream

Merge bugfix from 5.3 repo to 5.4
First, rebase branch against 5.4
$ git rebase --onto develop-5.4 bugfix~<num> bugfix
Where <num> is number of commits in your branch. I know it sucks, but
that's how it works :)
Or you can git cherry-pick each commit, (simpler solution anyone?).
Now your bugfix branch is rebased against  5.4-develop and ready to be merged
$ git flow feature finish -k bugfix 5.4-develop

Repeat the same for master:
$ git rebase --onto develop-master bugfix~<num> bugfix
$ git flow feature finish -k bugfix master-develop

Push changes:
$ git push

> 2. A bugfix for 5.4
> 3. A feature addition for 5.4
Same as above. Since all work is done in branches there's no
difference between bugfixes and features.

> 4. A release of 5.3.x

$ git flow release start 5.3.58
<bump version number now>
<prepare NEWS, UPGRADING and all that stuff>
$ git flow release publish 5.3.58 # publish (push to remote repo)
release-branch. It's not finished yet!
When release is ready you do
$ git flow release finish 5.3.58
Release get merged into 5.3-develop and 5.3-master, creating a tag
5.3.58 in 5.3-master

> 5. A release of 5.4.x
> 6. A release of 5.5 and 5.5.x

Same as 5.3

> Also, what would happen if bugfix/feature is contributed via github pull?

As soon as contributed bugfix/feature uses described process - nothing
really changes. You pull contributed branch locally and act like it
was yours.

>> Personally, I see migration from current setup that way so each
>> release branch (PHP-5.3, PHP-5.4 and master) becomes a separate
>> repository with adopted gitflow model (although it should be thought
>> through more carefully).
>> What do you think about that?
>
> I do not think it makes sense to keep the code in separate repos, given
> that about 90% of the code is the same. It also will make much harder to
> accept outside contribution - I'm not sure how easy would it be to merge
> a patch into three repos from one pull req.

Maybe, it was just an idea to throw into the air.

-- 
Regards,
Shein Alexey

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to