summaryrefslogtreecommitdiffstats
path: root/upstream/mageia-cauldron/man1/perlgit.1
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-15 19:43:11 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-15 19:43:11 +0000
commitfc22b3d6507c6745911b9dfcc68f1e665ae13dbc (patch)
treece1e3bce06471410239a6f41282e328770aa404a /upstream/mageia-cauldron/man1/perlgit.1
parentInitial commit. (diff)
downloadmanpages-l10n-fc22b3d6507c6745911b9dfcc68f1e665ae13dbc.tar.xz
manpages-l10n-fc22b3d6507c6745911b9dfcc68f1e665ae13dbc.zip
Adding upstream version 4.22.0.upstream/4.22.0
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'upstream/mageia-cauldron/man1/perlgit.1')
-rw-r--r--upstream/mageia-cauldron/man1/perlgit.11076
1 files changed, 1076 insertions, 0 deletions
diff --git a/upstream/mageia-cauldron/man1/perlgit.1 b/upstream/mageia-cauldron/man1/perlgit.1
new file mode 100644
index 00000000..70753920
--- /dev/null
+++ b/upstream/mageia-cauldron/man1/perlgit.1
@@ -0,0 +1,1076 @@
+.\" -*- mode: troff; coding: utf-8 -*-
+.\" Automatically generated by Pod::Man 5.01 (Pod::Simple 3.43)
+.\"
+.\" Standard preamble:
+.\" ========================================================================
+.de Sp \" Vertical space (when we can't use .PP)
+.if t .sp .5v
+.if n .sp
+..
+.de Vb \" Begin verbatim text
+.ft CW
+.nf
+.ne \\$1
+..
+.de Ve \" End verbatim text
+.ft R
+.fi
+..
+.\" \*(C` and \*(C' are quotes in nroff, nothing in troff, for use with C<>.
+.ie n \{\
+. ds C` ""
+. ds C' ""
+'br\}
+.el\{\
+. ds C`
+. ds C'
+'br\}
+.\"
+.\" Escape single quotes in literal strings from groff's Unicode transform.
+.ie \n(.g .ds Aq \(aq
+.el .ds Aq '
+.\"
+.\" If the F register is >0, we'll generate index entries on stderr for
+.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
+.\" entries marked with X<> in POD. Of course, you'll have to process the
+.\" output yourself in some meaningful fashion.
+.\"
+.\" Avoid warning from groff about undefined register 'F'.
+.de IX
+..
+.nr rF 0
+.if \n(.g .if rF .nr rF 1
+.if (\n(rF:(\n(.g==0)) \{\
+. if \nF \{\
+. de IX
+. tm Index:\\$1\t\\n%\t"\\$2"
+..
+. if !\nF==2 \{\
+. nr % 0
+. nr F 2
+. \}
+. \}
+.\}
+.rr rF
+.\" ========================================================================
+.\"
+.IX Title "PERLGIT 1"
+.TH PERLGIT 1 2023-11-28 "perl v5.38.2" "Perl Programmers Reference Guide"
+.\" For nroff, turn off justification. Always turn off hyphenation; it makes
+.\" way too many mistakes in technical documents.
+.if n .ad l
+.nh
+.SH NAME
+perlgit \- Detailed information about git and the Perl repository
+.SH DESCRIPTION
+.IX Header "DESCRIPTION"
+This document provides details on using git to develop Perl. If you are
+just interested in working on a quick patch, see perlhack first.
+This document is intended for people who are regular contributors to
+Perl, including those with write access to the git repository.
+.SH "CLONING THE REPOSITORY"
+.IX Header "CLONING THE REPOSITORY"
+All of Perl's source code is kept centrally in a Git repository at
+\&\fIgithub.com\fR.
+.PP
+You can make a read-only clone of the repository by running:
+.PP
+.Vb 1
+\& % git clone git@github.com:Perl/perl5.git perl
+.Ve
+.PP
+If you cannot use that for firewall reasons, you can also clone via http:
+.PP
+.Vb 1
+\& % git clone https://github.com/Perl/perl5.git perl
+.Ve
+.SH "WORKING WITH THE REPOSITORY"
+.IX Header "WORKING WITH THE REPOSITORY"
+Once you have changed into the repository directory, you can inspect
+it. After a clone the repository will contain a single local branch,
+which will be the current branch as well, as indicated by the asterisk.
+.PP
+.Vb 2
+\& % git branch
+\& * blead
+.Ve
+.PP
+Using the \-a switch to \f(CW\*(C`branch\*(C'\fR will also show the remote tracking
+branches in the repository:
+.PP
+.Vb 5
+\& % git branch \-a
+\& * blead
+\& origin/HEAD
+\& origin/blead
+\& ...
+.Ve
+.PP
+The branches that begin with "origin" correspond to the "git remote"
+that you cloned from (which is named "origin"). Each branch on the
+remote will be exactly tracked by these branches. You should NEVER do
+work on these remote tracking branches. You only ever do work in a
+local branch. Local branches can be configured to automerge (on pull)
+from a designated remote tracking branch. This is the case with the
+default branch \f(CW\*(C`blead\*(C'\fR which will be configured to merge from the
+remote tracking branch \f(CW\*(C`origin/blead\*(C'\fR.
+.PP
+You can see recent commits:
+.PP
+.Vb 1
+\& % git log
+.Ve
+.PP
+And pull new changes from the repository, and update your local
+repository (must be clean first)
+.PP
+.Vb 1
+\& % git pull
+.Ve
+.PP
+Assuming we are on the branch \f(CW\*(C`blead\*(C'\fR immediately after a pull, this
+command would be more or less equivalent to:
+.PP
+.Vb 2
+\& % git fetch
+\& % git merge origin/blead
+.Ve
+.PP
+In fact if you want to update your local repository without touching
+your working directory you do:
+.PP
+.Vb 1
+\& % git fetch
+.Ve
+.PP
+And if you want to update your remote-tracking branches for all defined
+remotes simultaneously you can do
+.PP
+.Vb 1
+\& % git remote update
+.Ve
+.PP
+Neither of these last two commands will update your working directory,
+however both will update the remote-tracking branches in your
+repository.
+.PP
+To make a local branch of a remote branch:
+.PP
+.Vb 1
+\& % git checkout \-b maint\-5.10 origin/maint\-5.10
+.Ve
+.PP
+To switch back to blead:
+.PP
+.Vb 1
+\& % git checkout blead
+.Ve
+.SS "Finding out your status"
+.IX Subsection "Finding out your status"
+The most common git command you will use will probably be
+.PP
+.Vb 1
+\& % git status
+.Ve
+.PP
+This command will produce as output a description of the current state
+of the repository, including modified files and unignored untracked
+files, and in addition it will show things like what files have been
+staged for the next commit, and usually some useful information about
+how to change things. For instance the following:
+.PP
+.Vb 3
+\& % git status
+\& On branch blead
+\& Your branch is ahead of \*(Aqorigin/blead\*(Aq by 1 commit.
+\&
+\& Changes to be committed:
+\& (use "git reset HEAD <file>..." to unstage)
+\&
+\& modified: pod/perlgit.pod
+\&
+\& Changes not staged for commit:
+\& (use "git add <file>..." to update what will be committed)
+\& (use "git checkout \-\- <file>..." to discard changes in working
+\& directory)
+\&
+\& modified: pod/perlgit.pod
+\&
+\& Untracked files:
+\& (use "git add <file>..." to include in what will be committed)
+\&
+\& deliberate.untracked
+.Ve
+.PP
+This shows that there were changes to this document staged for commit,
+and that there were further changes in the working directory not yet
+staged. It also shows that there was an untracked file in the working
+directory, and as you can see shows how to change all of this. It also
+shows that there is one commit on the working branch \f(CW\*(C`blead\*(C'\fR which has
+not been pushed to the \f(CW\*(C`origin\*(C'\fR remote yet. \fBNOTE\fR: This output
+is also what you see as a template if you do not provide a message to
+\&\f(CW\*(C`git commit\*(C'\fR.
+.SS "Patch workflow"
+.IX Subsection "Patch workflow"
+First, please read perlhack for details on hacking the Perl core.
+That document covers many details on how to create a good patch.
+.PP
+If you already have a Perl repository, you should ensure that you're on
+the \fIblead\fR branch, and your repository is up to date:
+.PP
+.Vb 2
+\& % git checkout blead
+\& % git pull
+.Ve
+.PP
+It's preferable to patch against the latest blead version, since this
+is where new development occurs for all changes other than critical bug
+fixes. Critical bug fix patches should be made against the relevant
+maint branches, or should be submitted with a note indicating all the
+branches where the fix should be applied.
+.PP
+Now that we have everything up to date, we need to create a temporary
+new branch for these changes and switch into it:
+.PP
+.Vb 1
+\& % git checkout \-b orange
+.Ve
+.PP
+which is the short form of
+.PP
+.Vb 2
+\& % git branch orange
+\& % git checkout orange
+.Ve
+.PP
+Creating a topic branch makes it easier for the maintainers to rebase
+or merge back into the master blead for a more linear history. If you
+don't work on a topic branch the maintainer has to manually cherry pick
+your changes onto blead before they can be applied.
+.PP
+That'll get you scolded on perl5\-porters, so don't do that. Be Awesome.
+.PP
+Then make your changes. For example, if Leon Brocard changes his name
+to Orange Brocard, we should change his name in the AUTHORS file:
+.PP
+.Vb 1
+\& % perl \-pi \-e \*(Aqs{Leon Brocard}{Orange Brocard}\*(Aq AUTHORS
+.Ve
+.PP
+You can see what files are changed:
+.PP
+.Vb 4
+\& % git status
+\& On branch orange
+\& Changes to be committed:
+\& (use "git reset HEAD <file>..." to unstage)
+\&
+\& modified: AUTHORS
+.Ve
+.PP
+And you can see the changes:
+.PP
+.Vb 10
+\& % git diff
+\& diff \-\-git a/AUTHORS b/AUTHORS
+\& index 293dd70..722c93e 100644
+\& \-\-\- a/AUTHORS
+\& +++ b/AUTHORS
+\& @@ \-541,7 +541,7 @@ Lars Hecking <lhecking@nmrc.ucc.ie>
+\& Laszlo Molnar <laszlo.molnar@eth.ericsson.se>
+\& Leif Huhn <leif@hale.dkstat.com>
+\& Len Johnson <lenjay@ibm.net>
+\& \-Leon Brocard <acme@astray.com>
+\& +Orange Brocard <acme@astray.com>
+\& Les Peters <lpeters@aol.net>
+\& Lesley Binks <lesley.binks@gmail.com>
+\& Lincoln D. Stein <lstein@cshl.org>
+.Ve
+.PP
+Now commit your change locally:
+.PP
+.Vb 3
+\& % git commit \-a \-m \*(AqRename Leon Brocard to Orange Brocard\*(Aq
+\& Created commit 6196c1d: Rename Leon Brocard to Orange Brocard
+\& 1 files changed, 1 insertions(+), 1 deletions(\-)
+.Ve
+.PP
+The \f(CW\*(C`\-a\*(C'\fR option is used to include all files that git tracks that you
+have changed. If at this time, you only want to commit some of the
+files you have worked on, you can omit the \f(CW\*(C`\-a\*(C'\fR and use the command
+\&\f(CW\*(C`git\ add\ \fR\f(CIFILE\ ...\fR\f(CW\*(C'\fR before doing the commit. \f(CW\*(C`git\ add\ \-\-interactive\*(C'\fR allows you to even just commit portions of files
+instead of all the changes in them.
+.PP
+The \f(CW\*(C`\-m\*(C'\fR option is used to specify the commit message. If you omit it,
+git will open a text editor for you to compose the message
+interactively. This is useful when the changes are more complex than
+the sample given here, and, depending on the editor, to know that the
+first line of the commit message doesn't exceed the 50 character legal
+maximum. See "Commit message" in perlhack for more information about what
+makes a good commit message.
+.PP
+Once you've finished writing your commit message and exited your
+editor, git will write your change to disk and tell you something like
+this:
+.PP
+.Vb 2
+\& Created commit daf8e63: explain git status and stuff about remotes
+\& 1 files changed, 83 insertions(+), 3 deletions(\-)
+.Ve
+.PP
+If you re-run \f(CW\*(C`git status\*(C'\fR, you should see something like this:
+.PP
+.Vb 4
+\& % git status
+\& On branch orange
+\& Untracked files:
+\& (use "git add <file>..." to include in what will be committed)
+\&
+\& deliberate.untracked
+\&
+\& nothing added to commit but untracked files present (use "git add" to
+\& track)
+.Ve
+.PP
+When in doubt, before you do anything else, check your status and read
+it carefully, many questions are answered directly by the git status
+output.
+.PP
+You can examine your last commit with:
+.PP
+.Vb 1
+\& % git show HEAD
+.Ve
+.PP
+and if you are not happy with either the description or the patch
+itself you can fix it up by editing the files once more and then issue:
+.PP
+.Vb 1
+\& % git commit \-a \-\-amend
+.Ve
+.PP
+Now, create a fork on GitHub to push your branch to, and add it as a
+remote if you haven't already, as described in the GitHub documentation
+at <https://help.github.com/en/articles/working\-with\-forks>:
+.PP
+.Vb 1
+\& % git remote add fork git@github.com:MyUser/perl5.git
+.Ve
+.PP
+And push the branch to your fork:
+.PP
+.Vb 1
+\& % git push \-u fork orange
+.Ve
+.PP
+You should now submit a Pull Request (PR) on GitHub from the new branch
+to blead. For more information, see the GitHub documentation at
+<https://help.github.com/en/articles/creating\-a\-pull\-request\-from\-a\-fork>.
+.PP
+You can also send patch files to
+perl5\-porters@perl.org <mailto:perl5-porters@perl.org> directly if the
+patch is not ready to be applied, but intended for discussion.
+.PP
+To create a patch file for all your local changes:
+.PP
+.Vb 2
+\& % git format\-patch \-M blead..
+\& 0001\-Rename\-Leon\-Brocard\-to\-Orange\-Brocard.patch
+.Ve
+.PP
+Or for a lot of changes, e.g. from a topic branch:
+.PP
+.Vb 1
+\& % git format\-patch \-\-stdout \-M blead.. > topic\-branch\-changes.patch
+.Ve
+.PP
+If you want to delete your temporary branch, you may do so with:
+.PP
+.Vb 6
+\& % git checkout blead
+\& % git branch \-d orange
+\& error: The branch \*(Aqorange\*(Aq is not an ancestor of your current HEAD.
+\& If you are sure you want to delete it, run \*(Aqgit branch \-D orange\*(Aq.
+\& % git branch \-D orange
+\& Deleted branch orange.
+.Ve
+.SS "A note on derived files"
+.IX Subsection "A note on derived files"
+Be aware that many files in the distribution are derivative\-\-avoid
+patching them, because git won't see the changes to them, and the build
+process will overwrite them. Patch the originals instead. Most
+utilities (like perldoc) are in this category, i.e. patch
+\&\fIutils/perldoc.PL\fR rather than \fIutils/perldoc\fR. Similarly, don't
+create patches for files under \fR\f(CI$src_root\fR\fI/ext\fR from their copies found
+in \fI\fR\f(CI$install_root\fR\fI/lib\fR. If you are unsure about the proper location of
+a file that may have gotten copied while building the source
+distribution, consult the \fIMANIFEST\fR.
+.SS "Cleaning a working directory"
+.IX Subsection "Cleaning a working directory"
+The command \f(CW\*(C`git clean\*(C'\fR can with varying arguments be used as a
+replacement for \f(CW\*(C`make clean\*(C'\fR.
+.PP
+To reset your working directory to a pristine condition you can do:
+.PP
+.Vb 1
+\& % git clean \-dxf
+.Ve
+.PP
+However, be aware this will delete ALL untracked content. You can use
+.PP
+.Vb 1
+\& % git clean \-Xf
+.Ve
+.PP
+to remove all ignored untracked files, such as build and test
+byproduct, but leave any manually created files alone.
+.PP
+If you only want to cancel some uncommitted edits, you can use \f(CW\*(C`git
+checkout\*(C'\fR and give it a list of files to be reverted, or \f(CW\*(C`git checkout
+\&\-f\*(C'\fR to revert them all.
+.PP
+If you want to cancel one or several commits, you can use \f(CW\*(C`git reset\*(C'\fR.
+.SS Bisecting
+.IX Subsection "Bisecting"
+\&\f(CW\*(C`git\*(C'\fR provides a built-in way to determine which commit should be blamed
+for introducing a given bug. \f(CW\*(C`git bisect\*(C'\fR performs a binary search of
+history to locate the first failing commit. It is fast, powerful and
+flexible, but requires some setup and to automate the process an auxiliary
+shell script is needed.
+.PP
+The core provides a wrapper program, \fIPorting/bisect.pl\fR, which attempts to
+simplify as much as possible, making bisecting as simple as running a Perl
+one-liner. For example, if you want to know when this became an error:
+.PP
+.Vb 1
+\& perl \-e \*(Aqmy $a := 2\*(Aq
+.Ve
+.PP
+you simply run this:
+.PP
+.Vb 1
+\& .../Porting/bisect.pl \-e \*(Aqmy $a := 2;\*(Aq
+.Ve
+.PP
+Using \fIPorting/bisect.pl\fR, with one command (and no other files) it's easy to
+find out
+.IP \(bu 4
+Which commit caused this example code to break?
+.IP \(bu 4
+Which commit caused this example code to start working?
+.IP \(bu 4
+Which commit added the first file to match this regex?
+.IP \(bu 4
+Which commit removed the last file to match this regex?
+.PP
+usually without needing to know which versions of perl to use as start and
+end revisions, as \fIPorting/bisect.pl\fR automatically searches to find the
+earliest stable version for which the test case passes. Run
+\&\f(CW\*(C`Porting/bisect.pl \-\-help\*(C'\fR for the full documentation, including how to
+set the \f(CW\*(C`Configure\*(C'\fR and build time options.
+.PP
+If you require more flexibility than \fIPorting/bisect.pl\fR has to offer, you'll
+need to run \f(CW\*(C`git bisect\*(C'\fR yourself. It's most useful to use \f(CW\*(C`git bisect run\*(C'\fR
+to automate the building and testing of perl revisions. For this you'll need
+a shell script for \f(CW\*(C`git\*(C'\fR to call to test a particular revision. An example
+script is \fIPorting/bisect\-example.sh\fR, which you should copy \fBoutside\fR of
+the repository, as the bisect process will reset the state to a clean checkout
+as it runs. The instructions below assume that you copied it as \fI~/run\fR and
+then edited it as appropriate.
+.PP
+You first enter in bisect mode with:
+.PP
+.Vb 1
+\& % git bisect start
+.Ve
+.PP
+For example, if the bug is present on \f(CW\*(C`HEAD\*(C'\fR but wasn't in 5.10.0,
+\&\f(CW\*(C`git\*(C'\fR will learn about this when you enter:
+.PP
+.Vb 3
+\& % git bisect bad
+\& % git bisect good perl\-5.10.0
+\& Bisecting: 853 revisions left to test after this
+.Ve
+.PP
+This results in checking out the median commit between \f(CW\*(C`HEAD\*(C'\fR and
+\&\f(CW\*(C`perl\-5.10.0\*(C'\fR. You can then run the bisecting process with:
+.PP
+.Vb 1
+\& % git bisect run ~/run
+.Ve
+.PP
+When the first bad commit is isolated, \f(CW\*(C`git bisect\*(C'\fR will tell you so:
+.PP
+.Vb 4
+\& ca4cfd28534303b82a216cfe83a1c80cbc3b9dc5 is first bad commit
+\& commit ca4cfd28534303b82a216cfe83a1c80cbc3b9dc5
+\& Author: Dave Mitchell <davem@fdisolutions.com>
+\& Date: Sat Feb 9 14:56:23 2008 +0000
+\&
+\& [perl #49472] Attributes + Unknown Error
+\& ...
+\&
+\& bisect run success
+.Ve
+.PP
+You can peek into the bisecting process with \f(CW\*(C`git bisect log\*(C'\fR and
+\&\f(CW\*(C`git bisect visualize\*(C'\fR. \f(CW\*(C`git bisect reset\*(C'\fR will get you out of bisect
+mode.
+.PP
+Please note that the first \f(CW\*(C`good\*(C'\fR state must be an ancestor of the
+first \f(CW\*(C`bad\*(C'\fR state. If you want to search for the commit that \fIsolved\fR
+some bug, you have to negate your test case (i.e. exit with \f(CW1\fR if OK
+and \f(CW0\fR if not) and still mark the lower bound as \f(CW\*(C`good\*(C'\fR and the
+upper as \f(CW\*(C`bad\*(C'\fR. The "first bad commit" has then to be understood as
+the "first commit where the bug is solved".
+.PP
+\&\f(CW\*(C`git help bisect\*(C'\fR has much more information on how you can tweak your
+binary searches.
+.PP
+Following bisection you may wish to configure, build and test perl at
+commits identified by the bisection process. Sometimes, particularly
+with older perls, \f(CW\*(C`make\*(C'\fR may fail during this process. In this case
+you may be able to patch the source code at the older commit point. To
+do so, please follow the suggestions provided in
+"Building perl at older commits" in perlhack.
+.SS "Topic branches and rewriting history"
+.IX Subsection "Topic branches and rewriting history"
+Individual committers should create topic branches under
+\&\fByourname\fR/\fBsome_descriptive_name\fR:
+.PP
+.Vb 4
+\& % branch="$yourname/$some_descriptive_name"
+\& % git checkout \-b $branch
+\& ... do local edits, commits etc ...
+\& % git push origin \-u $branch
+.Ve
+.PP
+Should you be stuck with an ancient version of git (prior to 1.7), then
+\&\f(CW\*(C`git push\*(C'\fR will not have the \f(CW\*(C`\-u\*(C'\fR switch, and you have to replace the
+last step with the following sequence:
+.PP
+.Vb 3
+\& % git push origin $branch:refs/heads/$branch
+\& % git config branch.$branch.remote origin
+\& % git config branch.$branch.merge refs/heads/$branch
+.Ve
+.PP
+If you want to make changes to someone else's topic branch, you should
+check with its creator before making any change to it.
+.PP
+You
+might sometimes find that the original author has edited the branch's
+history. There are lots of good reasons for this. Sometimes, an author
+might simply be rebasing the branch onto a newer source point.
+Sometimes, an author might have found an error in an early commit which
+they wanted to fix before merging the branch to blead.
+.PP
+Currently the master repository is configured to forbid
+non-fast-forward merges. This means that the branches within can not be
+rebased and pushed as a single step.
+.PP
+The only way you will ever be allowed to rebase or modify the history
+of a pushed branch is to delete it and push it as a new branch under
+the same name. Please think carefully about doing this. It may be
+better to sequentially rename your branches so that it is easier for
+others working with you to cherry-pick their local changes onto the new
+version. (XXX: needs explanation).
+.PP
+If you want to rebase a personal topic branch, you will have to delete
+your existing topic branch and push as a new version of it. You can do
+this via the following formula (see the explanation about \f(CW\*(C`refspec\*(C'\fR's
+in the git push documentation for details) after you have rebased your
+branch:
+.PP
+.Vb 4
+\& # first rebase
+\& % git checkout $user/$topic
+\& % git fetch
+\& % git rebase origin/blead
+\&
+\& # then "delete\-and\-push"
+\& % git push origin :$user/$topic
+\& % git push origin $user/$topic
+.Ve
+.PP
+\&\fBNOTE:\fR it is forbidden at the repository level to delete any of the
+"primary" branches. That is any branch matching
+\&\f(CW\*(C`m!^(blead|maint|perl)!\*(C'\fR. Any attempt to do so will result in git
+producing an error like this:
+.PP
+.Vb 7
+\& % git push origin :blead
+\& *** It is forbidden to delete blead/maint branches in this repository
+\& error: hooks/update exited with error code 1
+\& error: hook declined to update refs/heads/blead
+\& To ssh://perl5.git.perl.org/perl
+\& ! [remote rejected] blead (hook declined)
+\& error: failed to push some refs to \*(Aqssh://perl5.git.perl.org/perl\*(Aq
+.Ve
+.PP
+As a matter of policy we do \fBnot\fR edit the history of the blead and
+maint\-* branches. If a typo (or worse) sneaks into a commit to blead or
+maint\-*, we'll fix it in another commit. The only types of updates
+allowed on these branches are "fast-forwards", where all history is
+preserved.
+.PP
+Annotated tags in the canonical perl.git repository will never be
+deleted or modified. Think long and hard about whether you want to push
+a local tag to perl.git before doing so. (Pushing simple tags is
+not allowed.)
+.SS Grafts
+.IX Subsection "Grafts"
+The perl history contains one mistake which was not caught in the
+conversion: a merge was recorded in the history between blead and
+maint\-5.10 where no merge actually occurred. Due to the nature of git,
+this is now impossible to fix in the public repository. You can remove
+this mis-merge locally by adding the following line to your
+\&\f(CW\*(C`.git/info/grafts\*(C'\fR file:
+.PP
+.Vb 1
+\& 296f12bbbbaa06de9be9d09d3dcf8f4528898a49 434946e0cb7a32589ed92d18008aaa1d88515930
+.Ve
+.PP
+It is particularly important to have this graft line if any bisecting
+is done in the area of the "merge" in question.
+.SH "WRITE ACCESS TO THE GIT REPOSITORY"
+.IX Header "WRITE ACCESS TO THE GIT REPOSITORY"
+Once you have write access, you will need to modify the URL for the
+origin remote to enable pushing. Edit \fI.git/config\fR with the
+\&\fBgit\-config\fR\|(1) command:
+.PP
+.Vb 1
+\& % git config remote.origin.url git@github.com:Perl/perl5.git
+.Ve
+.PP
+You can also set up your user name and e\-mail address. Most people do
+this once globally in their \fI~/.gitconfig\fR by doing something like:
+.PP
+.Vb 2
+\& % git config \-\-global user.name "Ævar Arnfjörð Bjarmason"
+\& % git config \-\-global user.email avarab@gmail.com
+.Ve
+.PP
+However, if you'd like to override that just for perl,
+execute something like the following in \fIperl\fR:
+.PP
+.Vb 1
+\& % git config user.email avar@cpan.org
+.Ve
+.PP
+It is also possible to keep \f(CW\*(C`origin\*(C'\fR as a git remote, and add a new
+remote for ssh access:
+.PP
+.Vb 1
+\& % git remote add camel git@github.com:Perl/perl5.git
+.Ve
+.PP
+This allows you to update your local repository by pulling from
+\&\f(CW\*(C`origin\*(C'\fR, which is faster and doesn't require you to authenticate, and
+to push your changes back with the \f(CW\*(C`camel\*(C'\fR remote:
+.PP
+.Vb 2
+\& % git fetch camel
+\& % git push camel
+.Ve
+.PP
+The \f(CW\*(C`fetch\*(C'\fR command just updates the \f(CW\*(C`camel\*(C'\fR refs, as the objects
+themselves should have been fetched when pulling from \f(CW\*(C`origin\*(C'\fR.
+.SS "Working with Github pull requests"
+.IX Subsection "Working with Github pull requests"
+Pull requests typically originate from outside of the \f(CW\*(C`Perl/perl.git\*(C'\fR
+repository, so if you want to test or work with it locally a vanilla
+\&\f(CW\*(C`git fetch\*(C'\fR from the \f(CW\*(C`Perl/perl5.git\*(C'\fR repository won't fetch it.
+.PP
+However Github does provide a mechanism to fetch a pull request to a
+local branch. They are available on Github remotes under \f(CW\*(C`pull/\*(C'\fR, so
+you can use \f(CW\*(C`git fetch pull/\fR\f(CIPRID\fR\f(CW/head:\fR\f(CIlocalname\fR\f(CW\*(C'\fR to make a
+local copy. eg. to fetch pull request 9999 to the local branch
+\&\f(CW\*(C`local\-branch\-name\*(C'\fR run:
+.PP
+.Vb 1
+\& git fetch origin pull/9999/head:local\-branch\-name
+.Ve
+.PP
+and then:
+.PP
+.Vb 1
+\& git checkout local\-branch\-name
+.Ve
+.PP
+Note: this branch is not rebased on \f(CW\*(C`blead\*(C'\fR, so instead of the
+checkout above, you might want:
+.PP
+.Vb 1
+\& git rebase origin/blead local\-branch\-name
+.Ve
+.PP
+which rebases \f(CW\*(C`local\-branch\-name\*(C'\fR on \f(CW\*(C`blead\*(C'\fR, and checks it out.
+.PP
+Alternatively you can configure the remote to fetch all pull requests
+as remote-tracking branches. To do this edit the remote in
+\&\fI.git/config\fR, for example if your github remote is \f(CW\*(C`origin\*(C'\fR you'd
+have:
+.PP
+.Vb 3
+\& [remote "origin"]
+\& url = git@github.com:/Perl/perl5.git
+\& fetch = +refs/heads/*:refs/remotes/origin/*
+.Ve
+.PP
+Add a line to map the remote pull request branches to remote-tracking
+branches:
+.PP
+.Vb 4
+\& [remote "origin"]
+\& url = git@github.com:/Perl/perl5.git
+\& fetch = +refs/heads/*:refs/remotes/origin/*
+\& fetch = +refs/pull/*/head:refs/remotes/origin/pull/*
+.Ve
+.PP
+and then do a fetch as normal:
+.PP
+.Vb 1
+\& git fetch origin
+.Ve
+.PP
+This will create a remote-tracking branch for every pull request, including
+closed requests.
+.PP
+To remove those remote-tracking branches, remove the line added above
+and prune:
+.PP
+.Vb 1
+\& git fetch \-p origin # or git remote prune origin
+.Ve
+.SS "Accepting a patch"
+.IX Subsection "Accepting a patch"
+If you have received a patch file generated using the above section,
+you should try out the patch.
+.PP
+First we need to create a temporary new branch for these changes and
+switch into it:
+.PP
+.Vb 1
+\& % git checkout \-b experimental
+.Ve
+.PP
+Patches that were formatted by \f(CW\*(C`git format\-patch\*(C'\fR are applied with
+\&\f(CW\*(C`git am\*(C'\fR:
+.PP
+.Vb 2
+\& % git am 0001\-Rename\-Leon\-Brocard\-to\-Orange\-Brocard.patch
+\& Applying Rename Leon Brocard to Orange Brocard
+.Ve
+.PP
+Note that some UNIX mail systems can mess with text attachments containing
+\&'From '. This will fix them up:
+.PP
+.Vb 2
+\& % perl \-pi \-e\*(Aqs/^>From /From /\*(Aq \e
+\& 0001\-Rename\-Leon\-Brocard\-to\-Orange\-Brocard.patch
+.Ve
+.PP
+If just a raw diff is provided, it is also possible use this two-step
+process:
+.PP
+.Vb 3
+\& % git apply bugfix.diff
+\& % git commit \-a \-m "Some fixing" \e
+\& \-\-author="That Guy <that.guy@internets.com>"
+.Ve
+.PP
+Now we can inspect the change:
+.PP
+.Vb 4
+\& % git show HEAD
+\& commit b1b3dab48344cff6de4087efca3dbd63548ab5e2
+\& Author: Leon Brocard <acme@astray.com>
+\& Date: Fri Dec 19 17:02:59 2008 +0000
+\&
+\& Rename Leon Brocard to Orange Brocard
+\&
+\& diff \-\-git a/AUTHORS b/AUTHORS
+\& index 293dd70..722c93e 100644
+\& \-\-\- a/AUTHORS
+\& +++ b/AUTHORS
+\& @@ \-541,7 +541,7 @@ Lars Hecking <lhecking@nmrc.ucc.ie>
+\& Laszlo Molnar <laszlo.molnar@eth.ericsson.se>
+\& Leif Huhn <leif@hale.dkstat.com>
+\& Len Johnson <lenjay@ibm.net>
+\& \-Leon Brocard <acme@astray.com>
+\& +Orange Brocard <acme@astray.com>
+\& Les Peters <lpeters@aol.net>
+\& Lesley Binks <lesley.binks@gmail.com>
+\& Lincoln D. Stein <lstein@cshl.org>
+.Ve
+.PP
+If you are a committer to Perl and you think the patch is good, you can
+then merge it into blead then push it out to the main repository:
+.PP
+.Vb 3
+\& % git checkout blead
+\& % git merge experimental
+\& % git push origin blead
+.Ve
+.PP
+If you want to delete your temporary branch, you may do so with:
+.PP
+.Vb 7
+\& % git checkout blead
+\& % git branch \-d experimental
+\& error: The branch \*(Aqexperimental\*(Aq is not an ancestor of your current
+\& HEAD. If you are sure you want to delete it, run \*(Aqgit branch \-D
+\& experimental\*(Aq.
+\& % git branch \-D experimental
+\& Deleted branch experimental.
+.Ve
+.SS "Committing to blead"
+.IX Subsection "Committing to blead"
+The 'blead' branch will become the next production release of Perl.
+.PP
+Before pushing \fIany\fR local change to blead, it's incredibly important
+that you do a few things, lest other committers come after you with
+pitchforks and torches:
+.IP \(bu 4
+Make sure you have a good commit message. See "Commit
+message" in perlhack for details.
+.IP \(bu 4
+Run the test suite. You might not think that one typo fix would break a
+test file. You'd be wrong. Here's an example of where not running the
+suite caused problems. A patch was submitted that added a couple of
+tests to an existing \fI.t\fR. It couldn't possibly affect anything else, so
+no need to test beyond the single affected \fI.t\fR, right? But, the
+submitter's email address had changed since the last of their
+submissions, and this caused other tests to fail. Running the test
+target given in the next item would have caught this problem.
+.IP \(bu 4
+If you don't run the full test suite, at least \f(CW\*(C`make test_porting\*(C'\fR.
+This will run basic sanity checks. To see which sanity checks, have a
+look in \fIt/porting\fR.
+.IP \(bu 4
+If you make any changes that affect miniperl or core routines that have
+different code paths for miniperl, be sure to run \f(CW\*(C`make minitest\*(C'\fR.
+This will catch problems that even the full test suite will not catch
+because it runs a subset of tests under miniperl rather than perl.
+.SS "On merging and rebasing"
+.IX Subsection "On merging and rebasing"
+Simple, one-off commits pushed to the 'blead' branch should be simple
+commits that apply cleanly. In other words, you should make sure your
+work is committed against the current position of blead, so that you can
+push back to the master repository without merging.
+.PP
+Sometimes, blead will move while you're building or testing your
+changes. When this happens, your push will be rejected with a message
+like this:
+.PP
+.Vb 7
+\& To ssh://perl5.git.perl.org/perl.git
+\& ! [rejected] blead \-> blead (non\-fast\-forward)
+\& error: failed to push some refs to \*(Aqssh://perl5.git.perl.org/perl.git\*(Aq
+\& To prevent you from losing history, non\-fast\-forward updates were
+\& rejected Merge the remote changes (e.g. \*(Aqgit pull\*(Aq) before pushing
+\& again. See the \*(AqNote about fast\-forwards\*(Aq section of \*(Aqgit push \-\-help\*(Aq
+\& for details.
+.Ve
+.PP
+When this happens, you can just \fIrebase\fR your work against the new
+position of blead, like this (assuming your remote for the master
+repository is "p5p"):
+.PP
+.Vb 2
+\& % git fetch p5p
+\& % git rebase p5p/blead
+.Ve
+.PP
+You will see your commits being re-applied, and you will then be able to
+push safely. More information about rebasing can be found in the
+documentation for the \fBgit\-rebase\fR\|(1) command.
+.PP
+For larger sets of commits that only make sense together, or that would
+benefit from a summary of the set's purpose, you should use a merge
+commit. You should perform your work on a topic branch, which you should regularly rebase
+against blead to ensure that your code is not broken by blead moving.
+When you have finished your work, please perform a final rebase and
+test. Linear history is something that gets lost with every
+commit on blead, but a final rebase makes the history linear
+again, making it easier for future maintainers to see what has
+happened. Rebase as follows (assuming your work was on the
+branch \f(CW\*(C`committer/somework\*(C'\fR):
+.PP
+.Vb 2
+\& % git checkout committer/somework
+\& % git rebase blead
+.Ve
+.PP
+Then you can merge it into master like this:
+.PP
+.Vb 3
+\& % git checkout blead
+\& % git merge \-\-no\-ff \-\-no\-commit committer/somework
+\& % git commit \-a
+.Ve
+.PP
+The switches above deserve explanation. \f(CW\*(C`\-\-no\-ff\*(C'\fR indicates that even
+if all your work can be applied linearly against blead, a merge commit
+should still be prepared. This ensures that all your work will be shown
+as a side branch, with all its commits merged into the mainstream blead
+by the merge commit.
+.PP
+\&\f(CW\*(C`\-\-no\-commit\*(C'\fR means that the merge commit will be \fIprepared\fR but not
+\&\fIcommitted\fR. The commit is then actually performed when you run the
+next command, which will bring up your editor to describe the commit.
+Without \f(CW\*(C`\-\-no\-commit\*(C'\fR, the commit would be made with nearly no useful
+message, which would greatly diminish the value of the merge commit as a
+placeholder for the work's description.
+.PP
+When describing the merge commit, explain the purpose of the branch, and
+keep in mind that this description will probably be used by the
+eventual release engineer when reviewing the next perldelta document.
+.PP
+If the subsequent \fIpush\fR fails then you must be careful on how you \fIrebase\fR.
+If you use
+.PP
+.Vb 1
+\& % git rebase p5p/blead
+.Ve
+.PP
+or
+.PP
+.Vb 1
+\& % git pull \-\-rebase
+.Ve
+.PP
+then your carefully created merge commit will be lost! To avoid this you
+can use:
+.PP
+.Vb 2
+\& % git fetch p5p
+\& % git rebase \-\-rebase\-merges p5p/blead
+.Ve
+.PP
+This will recreate your merge commit.
+.PP
+(Should you be stuck with an older version of git (prior to 2.18), then
+\&\f(CW\*(C`git rebase\*(C'\fR will not have the \f(CW\*(C`\-\-rebase\-merges\*(C'\fR switch, instead you
+have to use the \f(CW\*(C`\-\-preserve\-merges\*(C'\fR switch.)
+.SS "Committing to maintenance versions"
+.IX Subsection "Committing to maintenance versions"
+Maintenance versions should only be altered to add critical bug fixes,
+see perlpolicy.
+.PP
+To commit to a maintenance version of perl, you need to create a local
+tracking branch:
+.PP
+.Vb 1
+\& % git checkout \-\-track \-b maint\-5.005 origin/maint\-5.005
+.Ve
+.PP
+This creates a local branch named \f(CW\*(C`maint\-5.005\*(C'\fR, which tracks the
+remote branch \f(CW\*(C`origin/maint\-5.005\*(C'\fR. Then you can pull, commit, merge
+and push as before.
+.PP
+You can also cherry-pick commits from blead and another branch, by
+using the \f(CW\*(C`git cherry\-pick\*(C'\fR command. It is recommended to use the
+\&\fB\-x\fR option to \f(CW\*(C`git cherry\-pick\*(C'\fR in order to record the SHA1 of the
+original commit in the new commit message.
+.PP
+Before pushing any change to a maint version, make sure you've
+satisfied the steps in "Committing to blead" above.
+.SS "Using a smoke-me branch to test changes"
+.IX Subsection "Using a smoke-me branch to test changes"
+Sometimes a change affects code paths which you cannot test on the OSes
+which are directly available to you and it would be wise to have users
+on other OSes test the change before you commit it to blead.
+.PP
+Fortunately, there is a way to get your change smoke-tested on various
+OSes: push it to a "smoke-me" branch and wait for certain automated
+smoke-testers to report the results from their OSes.
+A "smoke-me" branch is identified by the branch name: specifically, as
+seen on github.com it must be a local branch whose first name
+component is precisely \f(CW\*(C`smoke\-me\*(C'\fR.
+.PP
+The procedure for doing this is roughly as follows (using the example of
+tonyc's smoke-me branch called win32stat):
+.PP
+First, make a local branch and switch to it:
+.PP
+.Vb 1
+\& % git checkout \-b win32stat
+.Ve
+.PP
+Make some changes, build perl and test your changes, then commit them to
+your local branch. Then push your local branch to a remote smoke-me
+branch:
+.PP
+.Vb 1
+\& % git push origin win32stat:smoke\-me/tonyc/win32stat
+.Ve
+.PP
+Now you can switch back to blead locally:
+.PP
+.Vb 1
+\& % git checkout blead
+.Ve
+.PP
+and continue working on other things while you wait a day or two,
+keeping an eye on the results reported for your smoke-me branch at
+<http://perl.develop\-help.com/?b=smoke\-me/tonyc/win32state>.
+.PP
+If all is well then update your blead branch:
+.PP
+.Vb 1
+\& % git pull
+.Ve
+.PP
+then checkout your smoke-me branch once more and rebase it on blead:
+.PP
+.Vb 1
+\& % git rebase blead win32stat
+.Ve
+.PP
+Now switch back to blead and merge your smoke-me branch into it:
+.PP
+.Vb 2
+\& % git checkout blead
+\& % git merge win32stat
+.Ve
+.PP
+As described earlier, if there are many changes on your smoke-me branch
+then you should prepare a merge commit in which to give an overview of
+those changes by using the following command instead of the last
+command above:
+.PP
+.Vb 1
+\& % git merge win32stat \-\-no\-ff \-\-no\-commit
+.Ve
+.PP
+You should now build perl and test your (merged) changes one last time
+(ideally run the whole test suite, but failing that at least run the
+\&\fIt/porting/*.t\fR tests) before pushing your changes as usual:
+.PP
+.Vb 1
+\& % git push origin blead
+.Ve
+.PP
+Finally, you should then delete the remote smoke-me branch:
+.PP
+.Vb 1
+\& % git push origin :smoke\-me/tonyc/win32stat
+.Ve
+.PP
+(which is likely to produce a warning like this, which can be ignored:
+.PP
+.Vb 4
+\& remote: fatal: ambiguous argument
+\& \*(Aqrefs/heads/smoke\-me/tonyc/win32stat\*(Aq:
+\& unknown revision or path not in the working tree.
+\& remote: Use \*(Aq\-\-\*(Aq to separate paths from revisions
+.Ve
+.PP
+) and then delete your local branch:
+.PP
+.Vb 1
+\& % git branch \-d win32stat
+.Ve