git workflow draft

Michael Pyne mpyne at kde.org
Wed Feb 16 21:05:15 GMT 2011


On Wednesday, February 16, 2011 13:45:46 Stefan Majewsky wrote:
> On Tue, Feb 15, 2011 at 6:51 PM, Aaron J. Seigo <aseigo at kde.org> wrote:
> > Only features / topics that are intended from the state to be merged
> > with
> > master should end up in the main repository, however. More experimental
> > and/or long term efforts (an example presented was the kconfig refactor
> > leading up to 4.0) should start in a personal clone, and when/if the
> > work crosses the border into "this is realistically going to be merged
> > with master" it can be moved into a branch in the main repository.
> 
> As far as I'm concerned, the only problem with such branch moves is
> the potentially epic number of commit notification mails. If so, the
> email hook should check if the push generates a new branch, and send
> only one mail then, like "100 commits have been pushed into the new
> branch foobar; see >>here<< for a complete log vs. master and >>here<<
> for the diff".

This actually came up elsewhere in the meeting as well.

There are two major proposed methods on integrating a feature development 
branch back into master when ready.

1. You can use git-merge in order to merge 2 or more branches into a single 
commit. The resulting commit is essentially just a normal commit with more 
than one parent. Because of this, it is possible for git to verify that every 
commit in history of each parent is present, and more importantly for this 
problem, there is no duplication of commit emails (since there's only the 1 
new commit).

A disadvantage is that it can clutter the output of GUI (and CLI) based tools, 
especially if there are multiple active branches in development at once.

2. You can use git-rebase to basically reapply the diff for every commit in a 
given branch off of a different base commit. For example:

* - A - G - H - I - J - K   master
    \ - B - C - D - E - F   solid/make-it-cool

In this history tree make-it-cool and master have both diverged from A. If 
git-rebase were run to integrate make-it-cool into master, the result would 
look something like:

* - A - G - H - I - J - K - B' - C' - D' - E' - F' master

Every commit is still there. However, B', C', etc. are logically *new* commits 
that were created by git-rebase, but with the same commit message (the commit 
itself would be generated by generating the diff between the original commit 
and its parent, and then re-applying on the new parent).

Since we're generating new commits anyways, it is also possible to "clean up" 
the history upon integration (e.g. merge logically related commits C' and D' 
into C', or split a too-large commit E' into E1' and E2').

However since they are new commits, they would also result in new commit 
emails being sent, which could be quite the disaster for large branches. In 
addition some of those re-sent commit emails might try to duplicate previously 
taken actions for no reason (e.g. a needless CCMAIL: or GUI:).

An easy way to solve duplicates is to disable sending commit mails for 
branches other than master, but I personally dislike that solution as it would 
result in mailing lists like #kde-commits not receiving any emails until the 
branch is fully landed on master. (I hate to say it, but imagine a security 
mistake on ksslsocket.cpp in commit 88 of a 121-commit rebase branch -- is 
everyone on #kde-commits going to review that deeply into the commit chain?)

There may be a way to allow emails on branches and still filter out duplicates 
upon merging, but the sysadmins (IIRC) didn't know of a way to do it offhand.

In addition as Andreas Pakulat mentioned in a response to a rebase-workflow in 
kde-scm-interest, this completely deletes the fact that the development 
happened in a branch at all (we could simply retain the old solid/make-it-cool 
ref so we don't lose that history, but that would make the repository 
correspondingly larger).

A lot of this debate hinges on how we want email-based review to work however 
(to be clear, kde-commits is *not* the only recipient of email for each git 
commit, the CIA.vc web service also receives email for each commit). If we 
want to avoid huge email bombs then we need to either use a merge-based 
workflow in general, or have some other technical solution to allow for a 
rebase-based workflow, such as your idea regarding lumping everything into a 
simple notification email (although this means CIA.vc and possibly things like 
Commit Filter wouldn't work... :( )

Regards,
 - Michael Pyne
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: This is a digitally signed message part.
URL: <http://mail.kde.org/pipermail/kde-core-devel/attachments/20110216/12ad51e7/attachment.sig>


More information about the kde-core-devel mailing list