This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Some additions to perlrepository.pod
[perl5.git] / pod / perlrepository.pod
1 =head1 NAME
2
3 perlrepository - Using the Perl source repository
4
5 =head1 SYNOPSIS
6
7 All of Perl's source code is kept centrally in a Git repository. The
8 repository contains many Perl revisions from Perl 1 onwards and all the
9 revisions from Perforce, the version control system we were using
10 previously. This repository is accessible in different ways.
11
12 The full repository takes up about 80MB of disk space. A check out of
13 the blead branch (that is, the master branch, which contains bleadperl,
14 the development version of perl 5) takes up about 160MB of disk space
15 (including the repository). A build of bleadperl takes up about 200MB
16 (including the repository and the check out).
17
18 =head1 GETTING ACCESS TO THE REPOSITORY
19
20 =head2 READ ACCESS VIA THE WEB
21
22 You may access this over the web. This allows you to browse the tree,
23 see recent commits, search for particular commits and more. You may
24 access it at:
25
26   http://perl5.git.perl.org/perl.git
27
28 =head2 READ ACCESS VIA GIT
29
30 You will need a copy of Git for your computer. You can fetch a copy of
31 the repository using the Git protocol (which uses port 9418):
32
33   git clone git://perl5.git.perl.org/perl.git perl-git
34
35 This clones the repository and makes a local copy in the F<perl-git>
36 directory.
37
38 If your local network does not allow you to use port 9418, then you can
39 fetch a copy of the repository over HTTP (this is slower):
40
41   git clone http://perl5.git.perl.org/perl.git perl-http
42
43 This clones the repository and makes a local copy in the F<perl-http>
44 directory.
45
46 =head2 WRITE ACCESS TO THE REPOSITORY
47
48 If you are a committer, then you can fetch a copy of the repository
49 that you can push back on with:
50
51   git clone ssh://perl5.git.perl.org/gitroot/perl.git perl-ssh
52
53 This clones the repository and makes a local copy in the 'perl-ssh'
54 directory.
55
56 If you clone using git, which is faster than ssh, then you will need to
57 modify your config in order to enable pushing. Edit F<.git/config>
58 where you will see something like:
59
60   [remote "origin"]
61   url = git://perl5.git.perl.org/perl.git
62
63 change that to something like this:
64
65   [remote "origin"]
66   url = ssh://perl5.git.perl.org/gitroot/perl.git
67
68 NOTE: there are symlinks set up so that the /gitroot is actually
69 optional.
70
71 You can also set up your user name and e-mail address. For example
72
73   % git config user.name "Leon Brocard"
74   % git config user.email acme@astray.com
75
76 It is also possible to keep C<origin> as a git remote, and add a new
77 remote for ssh access:
78
79   % git remote add camel user@camel:/gitroot/perl.git
80
81 This allows you to update your local repository by pulling from
82 C<origin>, which is faster and doesn't require you to authenticate, and
83 to push your changes back with the C<camel> remote:
84
85   % git fetch camel
86   % git push camel
87
88 The C<fetch> command just updates the C<camel> refs, as the objects
89 themselves should have been fetched when pulling from C<origin>.
90
91 =head1 OVERVIEW OF THE REPOSITORY
92
93 Once you have changed into the repository directory, you can inspect
94 it.
95
96 After a clone the repository will contain a single local branch, which
97 will be the current branch as well, as indicated by the asterix.
98
99   % git branch
100   * blead
101
102 Using the -a switch to C<branch> will also show the remote tracking
103 branches in the repository:
104
105   % git branch -a
106   * blead
107     origin/HEAD
108     origin/blead
109   ...
110
111 The branches that begin with "origin" correspond to the "git remote"
112 that you cloned from (which is named "origin"). Each branch on the
113 remote will be exactly tracked by theses branches. You should NEVER do
114 work on these remote tracking branches. You only ever do work in a
115 local branch. Local branches can be configured to automerge (on pull)
116 from a designated remote tracking branch. This is the case with the
117 default branch C<blead> which will be configured to merge from the
118 remote tracking branch C<origin/blead>.
119
120 You can see recent commits:
121
122   % git log
123
124 And pull new changes from the repository, and update your local
125 repository (must be clean first)
126
127   % git pull
128
129 Assuming we are on the branch C<blead> immediately after a pull, this
130 command would be more or less equivalent to:
131
132   % git fetch
133   % git merge origin/blead
134
135 In fact if you want to update your local repository without touching
136 your working directory you do:
137
138   % git fetch
139
140 And if you want to update your remote-tracking branches for all defined
141 remotes simultaneously you can do
142
143   % git remote update
144
145 Neither of these last two commands will update your working directory,
146 however both will update the remote-tracking branches in your
147 repository.
148
149 To switch to another branch:
150
151   % git checkout origin/maint-5.8-dor
152
153 To switch back to blead:
154
155   % git checkout blead
156
157 =head2 FINDING OUT YOUR STATUS
158
159 The most common git command you will use will probably be
160
161   % git status
162
163 This command will produce as output a description of the current state
164 of the repository, including modified files and unignored untracked
165 files, and in addition it will show things like what files have been
166 staged for the next commit, and usually some useful information about
167 how to change things. For instance the following:
168
169   $ git status
170   # On branch blead
171   # Your branch is ahead of 'origin/blead' by 1 commit.
172   #
173   # Changes to be committed:
174   #   (use "git reset HEAD <file>..." to unstage)
175   #
176   #       modified:   pod/perlrepository.pod
177   #
178   # Changed but not updated:
179   #   (use "git add <file>..." to update what will be committed)
180   #
181   #       modified:   pod/perlrepository.pod
182   #
183   # Untracked files:
184   #   (use "git add <file>..." to include in what will be committed)
185   #
186   #       deliberate.untracked
187
188 This shows that there were changes to this document staged for commit,
189 and that there were further changes in the working directory not yet
190 staged. It also shows that there was an untracked file in the working
191 directory, and as you can see shows how to change all of this. It also
192 shows that there is one commit on the  working branch C<blead> which
193 has not been pushed to the C<origin> remote yet. B<NOTE>: that this
194 output is also what you see as a template if you do not provide a
195 message to C<git commit>.
196
197 Assuming we commit all the mentioned changes above:
198
199   % git commit -a -m'explain git status and stuff about remotes'
200   Created commit daf8e63: explain git status and stuff about remotes
201    1 files changed, 83 insertions(+), 3 deletions(-)
202
203 We can re-run git status and see something like this:
204
205   % git status
206   # On branch blead
207   # Your branch is ahead of 'origin/blead' by 2 commits.
208   #
209   # Untracked files:
210   #   (use "git add <file>..." to include in what will be committed)
211   #
212   #       deliberate.untracked
213   nothing added to commit but untracked files present (use "git add" to track)
214
215
216 When in doubt, before you do anything else, check your status and read
217 it carefully, many questions are answered directly by the git status
218 output.
219
220 =head1 SUBMITTING A PATCH
221
222 If you have a patch in mind for Perl, you should first get a copy of
223 the repository:
224
225   % git clone git://perl5.git.perl.org/perl.git perl-git
226
227 Then change into the directory:
228
229   % cd perl-git
230
231 Alternatively, if you already have a Perl repository, you should ensure
232 that you're on the I<blead> branch, and your repository is up to date:
233
234   % git checkout blead
235   % git pull
236
237 Now that we have everything up to date, we need to create a temporary
238 new branch for these changes and switch into it:
239
240   % git checkout -b orange
241
242 which is the short form of
243
244   % git branch orange
245   % git checkout orange
246
247 Then make your changes. For example, if Leon Brocard changes his name
248 to Orange Brocard, we should change his name in the AUTHORS file:
249
250   % perl -pi -e 's{Leon Brocard}{Orange Brocard}' AUTHORS
251
252 You can see what files are changed:
253
254   % git status
255   # On branch orange
256   # Changes to be committed:
257   #   (use "git reset HEAD <file>..." to unstage)
258   #
259   #     modified:   AUTHORS
260   #
261
262 And you can see the changes:
263
264   % git diff
265   diff --git a/AUTHORS b/AUTHORS
266   index 293dd70..722c93e 100644
267   --- a/AUTHORS
268   +++ b/AUTHORS
269   @@ -541,7 +541,7 @@    Lars Hecking                   <lhecking@nmrc.ucc.ie>
270    Laszlo Molnar                  <laszlo.molnar@eth.ericsson.se>
271    Leif Huhn                      <leif@hale.dkstat.com>
272    Len Johnson                    <lenjay@ibm.net>
273   -Leon Brocard                   <acme@astray.com>
274   +Orange Brocard                 <acme@astray.com>
275    Les Peters                     <lpeters@aol.net>
276    Lesley Binks                   <lesley.binks@gmail.com>
277    Lincoln D. Stein               <lstein@cshl.org>
278
279 Now commit your change locally:
280
281   % git add AUTHORS
282   % git commit -m 'Rename Leon Brocard to Orange Brocard'
283   Created commit 6196c1d: Rename Leon Brocard to Orange Brocard
284    1 files changed, 1 insertions(+), 1 deletions(-)
285
286 Now you should create a patch file for all your local changes:
287
288   % git format-patch origin
289   0001-Rename-Leon-Brocard-to-Orange-Brocard.patch
290
291 You should now send an email to perl5-porters@perl.org with a
292 description of your changes, and attach this patch file as an
293 attachment.
294
295 If you want to delete your temporary branch, you may do so with:
296
297   % git checkout blead
298   % git branch -d orange
299   error: The branch 'orange' is not an ancestor of your current HEAD.
300   If you are sure you want to delete it, run 'git branch -D orange'.
301   % git branch -D orange
302   Deleted branch orange.
303
304 =head1 ACCEPTING A PATCH
305
306 If you have received a patch file generated using the above section,
307 you should try out the patch.
308
309 First we need to create a temporary new branch for these changes and
310 switch into it:
311
312   % git checkout -b experimental
313
314 Patches that were formatted by C<git format-patch> are applied with
315 C<git am>:
316
317   % git am 0001-Rename-Leon-Brocard-to-Orange-Brocard.patch
318   Applying Rename Leon Brocard to Orange Brocard
319
320 If just a raw diff is provided, it is also possible use this two-step
321 process:
322
323   % git apply bugfix.diff
324   % git commit -am "Some fixing" --author="That Guy <that.guy@internets.com>"
325
326 Now we can inspect the change:
327
328   % git log
329   commit b1b3dab48344cff6de4087efca3dbd63548ab5e2
330   Author: Leon Brocard <acme@astray.com>
331   Date:   Fri Dec 19 17:02:59 2008 +0000
332
333     Rename Leon Brocard to Orange Brocard
334   ...
335
336   % git diff blead
337   diff --git a/AUTHORS b/AUTHORS
338   index 293dd70..722c93e 100644
339   --- a/AUTHORS
340   +++ b/AUTHORS
341   @@ -541,7 +541,7 @@ Lars Hecking                        <lhecking@nmrc.ucc.ie>
342    Laszlo Molnar                  <laszlo.molnar@eth.ericsson.se>
343    Leif Huhn                      <leif@hale.dkstat.com>
344    Len Johnson                    <lenjay@ibm.net>
345   -Leon Brocard                   <acme@astray.com>
346   +Orange Brocard                 <acme@astray.com>
347    Les Peters                     <lpeters@aol.net>
348    Lesley Binks                   <lesley.binks@gmail.com>
349    Lincoln D. Stein               <lstein@cshl.org>
350
351 If you are a committer to Perl and you think the patch is good, you can
352 then merge it into blead then push it out to the main repository:
353
354   % git checkout blead
355   % git merge experimental
356   % git push
357
358 If you want to delete your temporary branch, you may do so with:
359
360   % git checkout blead
361   % git branch -d experimental
362   error: The branch 'experimental' is not an ancestor of your current HEAD.
363   If you are sure you want to delete it, run 'git branch -D experimental'.
364   % git branch -D experimental
365   Deleted branch experimental.
366
367 =head1 CLEANING A WORKING DIRECTORY
368
369 The command C<git clean> can with varying arguments be used as a
370 replacement for make-clean.
371
372 To reset your working directory to a pristine condition you can do:
373
374   git clean -dxf
375
376 However, be aware this will delete ALL untracked content. You can use
377
378   git clean -Xf
379
380 to remove all ignored untracked files, such as build and test
381 byproduct, but leave any  manually created files alone.
382
383 If you only want to cancel some uncommitted edits, you can use
384 C<git checkout> and give it a list of files to be reverted.
385
386 If you want to cancel one or several commits, you can use C<git reset>.
387
388 =head1 BISECTING
389
390 C<git> provides a built-in way to determine, with a binary search in
391 the history, which commit should be blamed for introducing a given bug.
392
393 Suppose that we have a script F<~/testcase.pl> that exits with C<0>
394 when some behaviour is correct, and with C<1> when it's faulty. We need
395 an helper script that automates building C<perl> and running the
396 testcase:
397
398   % cat ~/run
399   #!/bin/sh
400   git clean -dxf
401   # If you can use ccache, add -Dcc=ccache\ gcc -Dld=gcc to the Configure line
402   sh Configure -des -Dusedevel -Doptimize="-g" || exit 125
403   make || exit 125
404   ./perl -Ilib ~/testcase.pl
405
406 This script may return C<125> to indicate that the corresponding commit
407 should be skipped. Otherwise, it returns the status of
408 F<~/testcase.pl>.
409
410 We first enter in bisect mode with:
411
412   % git bisect start
413
414 For example, if the bug is present on C<HEAD> but wasn't in 5.10.0,
415 C<git> will learn about this when you enter:
416
417   % git bisect bad
418   % git bisect good perl-5.10.0
419   Bisecting: 853 revisions left to test after this
420
421 This results in checking out the median commit between C<HEAD> and
422 C<perl-5.10.0>. We can then run the bisecting process with:
423
424   % git bisect run ~/run
425
426 When the first bad commit is isolated, C<git bisect> will tell you so:
427
428   ca4cfd28534303b82a216cfe83a1c80cbc3b9dc5 is first bad commit
429   commit ca4cfd28534303b82a216cfe83a1c80cbc3b9dc5
430   Author: Dave Mitchell <davem@fdisolutions.com>
431   Date:   Sat Feb 9 14:56:23 2008 +0000
432
433       [perl #49472] Attributes + Unkown Error
434       ...
435
436   bisect run success
437
438 You can peek into the bisecting process with C<git bisect log> and
439 C<git bisect visualize>. C<git bisect reset> will get you out of bisect
440 mode.
441
442 Please note that the first C<good> state must be an ancestor of the
443 first C<bad> state. If you want to search for the commit that I<solved>
444 some bug, you have to negate your test case (i.e. exit with C<1> if OK
445 and C<0> if not) and still mark the lower bound as C<good> and the
446 upper as C<bad>. The "first bad commit" has then to be understood as
447 the "first commit where the bug is solved".
448
449 C<git help bisect> has much more information on how you can tweak your
450 binary searches.
451
452 =head1 COMITTING TO MAINTENANCE VERSIONS
453
454 To commit to a maintenance version of perl, you need to create a local
455 tracking branch:
456
457   % git checkout --track -b maint-5.005 origin/maint-5.005
458
459 This creates a local branch named C<maint-5.005>, which tracks the remote
460 branch C<origin/maint-5.005>. Then you can pull, commit, merge and push as
461 before.
462
463 You can also cherry-pick commits from blead and another branch, by
464 using the C<git cherry-pick> command. It is recommended to use the B<-x>
465 option to C<git cherry-pick> in order to record the SHA1 of the original
466 commit in the new commit message.
467
468 =head1 SEE ALSO
469
470 The git documentation, accessible via C<git help command>.