|
|
|
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.
|