|  | 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/cook 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. | 
|  |  | 
|  | - [** OBSOLETE **] Optionally rebase topics that do not have any commit | 
|  | in next yet, when they 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. | 
|  |  | 
|  | - [** OBSOLETE **] 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 and other mirrors. | 
|  |  | 
|  |  | 
|  | 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. |