| From: Junio C Hamano <gitster@pobox.com> | |
| Date: Wed, 21 Nov 2007 16:32:55 -0800 | |
| Subject: Addendum to "MaintNotes" | |
| Abstract: Imagine that git development is racing along as usual, when our friendly | |
| neighborhood maintainer is struck down by a wayward bus. Out of the | |
| hordes of suckers (loyal developers), you have been tricked (chosen) to | |
| step up as the new maintainer. This howto will show you "how to" do it. | |
| The maintainer's git time is spent on three activities. | |
| - Communication (60%) | |
| Mailing list discussions on general design, fielding user | |
| questions, diagnosing bug reports; reviewing, commenting on, | |
| suggesting alternatives to, and rejecting patches. | |
| - Integration (30%) | |
| Applying new patches from the contributors while spotting and | |
| correcting minor mistakes, shuffling the integration and | |
| testing branches, pushing the results out, cutting the | |
| releases, and making announcements. | |
| - Own development (10%) | |
| Scratching my own itch and sending proposed patch series out. | |
| The policy on Integration is informally mentioned in "A Note | |
| from the maintainer" message, which is periodically posted to | |
| this mailing list after each feature release is made. | |
| The policy. | |
| - Feature releases are numbered as vX.Y.Z and are meant to | |
| contain bugfixes and enhancements in any area, including | |
| functionality, performance and usability, without regression. | |
| - Maintenance releases are numbered as vX.Y.Z.W and are meant | |
| to contain only bugfixes for the corresponding vX.Y.Z feature | |
| release and earlier maintenance releases vX.Y.Z.V (V < W). | |
| - 'master' branch is used to prepare for the next feature | |
| release. In other words, at some point, the tip of 'master' | |
| branch is tagged with vX.Y.Z. | |
| - 'maint' branch is used to prepare for the next maintenance | |
| release. After the feature release vX.Y.Z is made, the tip | |
| of 'maint' branch is set to that release, and bugfixes will | |
| accumulate on the branch, and at some point, the tip of the | |
| branch is tagged with vX.Y.Z.1, vX.Y.Z.2, and so on. | |
| - 'next' branch is used to publish changes (both enhancements | |
| and fixes) that (1) have worthwhile goal, (2) are in a fairly | |
| good shape suitable for everyday use, (3) but have not yet | |
| demonstrated to be regression free. New changes are tested | |
| in 'next' before merged to 'master'. | |
| - 'pu' branch is used to publish other proposed changes that do | |
| not yet pass the criteria set for 'next'. | |
| - The tips of 'master', 'maint' and 'next' branches will always | |
| fast-forward, to allow people to build their own | |
| customization on top of them. | |
| - Usually 'master' contains all of 'maint', 'next' contains all | |
| of 'master' and 'pu' contains all of 'next'. | |
| - The tip of 'master' is meant to be more stable than any | |
| tagged releases, and the users are encouraged to follow it. | |
| - The 'next' branch is where new action takes place, and the | |
| users are encouraged to test it so that regressions and bugs | |
| are found before new topics are merged to 'master'. | |
| A typical git day for the maintainer implements the above policy | |
| by doing the following: | |
| - Scan mailing list and #git channel log. Respond with review | |
| comments, suggestions etc. Kibitz. Collect potentially | |
| usable patches from the mailing list. Patches about a single | |
| topic go to one mailbox (I read my mail in Gnus, and type | |
| \C-o to save/append messages in files in mbox format). | |
| - Review the patches in the saved mailboxes. Edit proposed log | |
| message for typofixes and clarifications, and add Acks | |
| collected from the list. Edit patch to incorporate "Oops, | |
| that should have been like this" fixes from the discussion. | |
| - Classify the collected patches and handle 'master' and | |
| 'maint' updates: | |
| - Obviously correct fixes that pertain to the tip of 'maint' | |
| are directly applied to 'maint'. | |
| - Obviously correct fixes that pertain to the tip of 'master' | |
| are directly applied to 'master'. | |
| This step is done with "git am". | |
| $ git checkout master ;# or "git checkout maint" | |
| $ git am -3 -s mailbox | |
| $ make test | |
| - Merge downwards (maint->master): | |
| $ git checkout master | |
| $ git merge maint | |
| $ make test | |
| - Review the last issue of "What's cooking" message, review the | |
| topics scheduled for merging upwards (topic->master and | |
| topic->maint), and merge. | |
| $ git checkout master ;# or "git checkout maint" | |
| $ git merge ai/topic ;# or "git merge ai/maint-topic" | |
| $ git log -p ORIG_HEAD.. ;# final review | |
| $ git diff ORIG_HEAD.. ;# final review | |
| $ make test ;# final review | |
| $ git branch -d ai/topic ;# or "git branch -d ai/maint-topic" | |
| - Merge downwards (maint->master) if needed: | |
| $ git checkout master | |
| $ git merge maint | |
| $ make test | |
| - Merge downwards (master->next) if needed: | |
| $ git checkout next | |
| $ git merge master | |
| $ make test | |
| - Handle the remaining patches: | |
| - Anything unobvious that is applicable to 'master' (in other | |
| words, does not depend on anything that is still in 'next' | |
| and not in 'master') is applied to a new topic branch that | |
| is forked from the tip of 'master'. This includes both | |
| enhancements and unobvious fixes to 'master'. A topic | |
| branch is named as ai/topic where "ai" is typically | |
| author's initial and "topic" is a descriptive name of the | |
| topic (in other words, "what's the series is about"). | |
| - An unobvious fix meant for 'maint' is applied to a new | |
| topic branch that is forked from the tip of 'maint'. The | |
| topic is named as ai/maint-topic. | |
| - Changes that pertain to an existing topic are applied to | |
| the branch, but: | |
| - obviously correct ones are applied first; | |
| - questionable ones are discarded or applied to near the tip; | |
| - Replacement patches to an existing topic are accepted only | |
| for commits not in 'next'. | |
| The above except the "replacement" are all done with: | |
| $ git am -3 -s mailbox | |
| while patch replacement is often done by: | |
| $ git format-patch ai/topic~$n..ai/topic ;# export existing | |
| then replace some parts with the new patch, and reapplying: | |
| $ git reset --hard ai/topic~$n | |
| $ git am -3 -s 000*.txt | |
| The full test suite is always run for 'maint' and 'master' | |
| after patch application; for topic branches the tests are run | |
| as time permits. | |
| - Update "What's cooking" message to review the updates to | |
| existing topics, newly added topics and graduated topics. | |
| This step is helped with Meta/UWC script (where Meta/ contains | |
| a checkout of the 'todo' branch). | |
| - Merge topics to 'next'. For each branch whose tip is not | |
| merged to 'next', one of three things can happen: | |
| - The commits are all next-worthy; merge the topic to next: | |
| $ git checkout next | |
| $ git merge ai/topic ;# or "git merge ai/maint-topic" | |
| $ make test | |
| - The new parts are of mixed quality, but earlier ones are | |
| next-worthy; merge the early parts to next: | |
| $ git checkout next | |
| $ git merge ai/topic~2 ;# the tip two are dubious | |
| $ make test | |
| - Nothing is next-worthy; do not do anything. | |
| - Rebase topics that do not have any commit in next yet. This | |
| step is optional but sometimes is worth doing when an old | |
| series that is not in next can take advantage of low-level | |
| framework change that is merged to 'master' already. | |
| $ git rebase master ai/topic | |
| This step is helped with Meta/git-topic.perl script to | |
| identify which topic is rebaseable. There also is a | |
| pre-rebase hook to make sure that topics that are already in | |
| 'next' are not rebased beyond the merged commit. | |
| - Rebuild "pu" to merge the tips of topics not in 'next'. | |
| $ git checkout pu | |
| $ git reset --hard next | |
| $ git merge ai/topic ;# repeat for all remaining topics | |
| $ make test | |
| This step is helped with Meta/PU script | |
| - Push four integration branches to a private repository at | |
| k.org and run "make test" on all of them. | |
| - Push four integration branches to /pub/scm/git/git.git at | |
| k.org. This triggers its post-update hook which: | |
| (1) runs "git pull" in $HOME/git-doc/ repository to pull | |
| 'master' just pushed out; | |
| (2) runs "make doc" in $HOME/git-doc/, install the generated | |
| documentation in staging areas, which are separate | |
| repositories that have html and man branches checked | |
| out. | |
| (3) runs "git commit" in the staging areas, and run "git | |
| push" back to /pub/scm/git/git.git/ to update the html | |
| and man branches. | |
| (4) installs generated documentation to /pub/software/scm/git/docs/ | |
| to be viewed from http://www.kernel.org/ | |
| - Fetch html and man branches back from k.org, and push four | |
| integration branches and the two documentation branches to | |
| repo.or.cz | |
| Some observations to be made. | |
| * Each topic is tested individually, and also together with | |
| other topics cooking in 'next'. Until it matures, none part | |
| of it is merged to 'master'. | |
| * A topic already in 'next' can get fixes while still in | |
| 'next'. Such a topic will have many merges to 'next' (in | |
| other words, "git log --first-parent next" will show many | |
| "Merge ai/topic to next" for the same topic. | |
| * An unobvious fix for 'maint' is cooked in 'next' and then | |
| merged to 'master' to make extra sure it is Ok and then | |
| merged to 'maint'. | |
| * Even when 'next' becomes empty (in other words, all topics | |
| prove stable and are merged to 'master' and "git diff master | |
| next" shows empty), it has tons of merge commits that will | |
| never be in 'master'. | |
| * In principle, "git log --first-parent master..next" should | |
| show nothing but merges (in practice, there are fixup commits | |
| and reverts that are not merges). | |
| * Commits near the tip of a topic branch that are not in 'next' | |
| are fair game to be discarded, replaced or rewritten. | |
| Commits already merged to 'next' will not be. | |
| * Being in the 'next' branch is not a guarantee for a topic to | |
| be included in the next feature release. Being in the | |
| 'master' branch typically is. |