perlrepository - Using the Perl source repository

perlrepository - Perl ソースリポジトリを使う


All of Perl's source code is kept centrally in a Git repository at perl5.git.perl.org. The repository contains many Perl revisions from Perl 1 onwards and all the revisions from Perforce, the version control system we were using previously. This repository is accessible in different ways.

Perlのソースコードはすべて、perl5.git.perl.org の Git リポジトリに 集中管理されています。 このリポジトリには、Perl 1 以降の多くの Perl リビジョンと、 以前使用していたバージョン管理システムである Perforce のすべての リビジョンが含まれています。 このリポジトリには、さまざまな方法でアクセスできます。

The full repository takes up about 80MB of disk space. A check out of the blead branch (that is, the main development branch, which contains bleadperl, the development version of perl 5) takes up about 160MB of disk space (including the repository). A build of bleadperl takes up about 200MB (including the repository and the check out).

フルリポジトリは約 80 MBのディスクスペースを使用します。 blead ブランチ(つまり、perl 5 の開発バージョンである bleadperl を含む メイン開発ブランチ)からのチェックアウトは、約 160 MBのディスクスペース (リポジトリを含む)を使用します。 bleadperl のビルドは、約 200 MB(リポジトリとチェックアウトを含む)を 使用します。


Web 経由の読み込みアクセス

You may access the repository over the web. This allows you to browse the tree, see recent commits, subscribe to RSS feeds for the changes, search for particular commits and more. You may access it at:

Web 経由でリポジトリにアクセスできます。 これにより、ツリーの参照、最近のコミットの表示、変更の RSS フィードの購読、 特定のコミットの検索などが可能になります。 次の場所からアクセスできます:


A mirror of the repository is found at:



Git 経由の読み込みアクセス

You will need a copy of Git for your computer. You can fetch a copy of the repository using the Git protocol (which uses port 9418):

あなたのコンピュータ用の Git が必要です。 Git プロトコル(ポート 9418 を使用)を使用して、リポジトリのコピーを フェッチできます。

  git clone git://perl5.git.perl.org/perl.git perl-git

This clones the repository and makes a local copy in the perl-git directory.

これにより、リポジトリは複製され、perl-git ディレクトリに ローカルコピーが作成されます。

If your local network does not allow you to use port 9418, then you can fetch a copy of the repository over HTTP (this is slower):

ローカルネットワークでポート 9418 の使用が許可されていない場合は、 HTTP 経由でリポジトリのコピーをフェッチできます(これはより低速です)。

  git clone http://perl5.git.perl.org/perl.git perl-http

This clones the repository and makes a local copy in the perl-http directory.

これにより、リポジトリが複製され、perl-http ディレクトリに ローカルコピーが作成されます。


If you are a committer, then you can fetch a copy of the repository that you can push back on with:

コミッタであれば、プッシュバック可能なリポジトリのコピーを 取得することができます。

  git clone ssh://perl5.git.perl.org/gitroot/perl.git perl-ssh

This clones the repository and makes a local copy in the perl-ssh directory.

これにより、リポジトリが複製され、perl-ssh ディレクトリに ローカルコピーが作成されます。

If you cloned using the git protocol, which is faster than ssh, then you will need to modify your config in order to enable pushing. Edit .git/config where you will see something like:

ssh よりも高速な git プロトコルを使用してクローンを作成した場合は、 プッシュを有効にするために設定を変更する必要があります。 .git/config を編集すると、次のように表示されます。

  [remote "origin"]
  url = git://perl5.git.perl.org/perl.git

change that to something like this:


  [remote "origin"]
  url = ssh://perl5.git.perl.org/gitroot/perl.git

NOTE: there are symlinks set up so that the /gitroot is optional and since SSH is the default protocol you can actually shorten the "url" to perl5.git.perl.org:/perl.git.

注: /gitroot がオプションになるようにシンボリックリンクが設定されていて、 SSH がデフォルトのプロトコルなので、"url" を実際には perl5.git.perl.org:/perl.git に短縮できます。

You can also set up your user name and e-mail address. For example

ユーザー名と電子メールアドレスも設定できます。 例えば:

  % git config user.name "Leon Brocard"
  % git config user.email acme@astray.com

It is also possible to keep origin as a git remote, and add a new remote for ssh access:

origin を git remote として維持し、ssh アクセス用の新しい remote を 追加することも可能です:

  % git remote add camel perl5.git.perl.org:/perl.git

This allows you to update your local repository by pulling from origin, which is faster and doesn't require you to authenticate, and to push your changes back with the camel remote:

これにより、origin からプルしてローカルリポジトリを更新できます; これはより高速で、認証を必要としません; また、camel リモートで変更をプッシュバックすることもできます。

  % git fetch camel
  % git push camel

The fetch command just updates the camel refs, as the objects themselves should have been fetched when pulling from origin.

fetch コマンドは単に camel refs を更新するだけです; なぜなら、オブジェクト自体は origin からプルするときに フェッチされるべきだからです。

The committers have access to 2 servers that serve perl5.git.perl.org. One is camel.booking.com, which is the 'master' repository. The perl5.git.perl.org IP address also lives on this machine. The second one is dromedary.booking.com, which can be used for general testing and development. Dromedary syncs the git tree from camel every few minutes, you should not push there. Both machines also have a full CPAN mirror. To share files with the general public, dromedary serves your ~/public_html/ as http://users.perl5.git.perl.org/~yourlogin/

コミッタは、perl5.git.perl.org にサービスを提供する二つの サーバにアクセスできます。 一つは「マスター」リポジトリである camel.booking.com です。 perl5.git.perl.org の IP アドレスもこのマシンに存在します。 二つ目は dromedary.booking.com で、一般的なテストと開発に使用できます。 dromedary は数分ごとに camel から git ツリーを同期するので、そこに プッシュしてはいけません。 両方のマシンには完全な CPAN ミラーもあります。 dromedary はファイルを一般公開するために、 ~/public_html/ を http://users.perl5.git.perl.org/~yourlogin/ として 提供しています。


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.

クローン作成後、リポジトリには単一のローカルブランチが含まれます。 このローカルブランチは、アスタリスクで示されているように、 現在のブランチにもなります。

  % git branch
  * blead

Using the -a switch to branch will also show the remote tracking branches in the repository:

branch に -a スイッチを使用すると、リポジトリ内の リモートトラッキングブランチも表示されます:

  % git branch -a
  * blead

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 theses 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 blead which will be configured to merge from the remote tracking branch origin/blead.

"origin" で始まるブランチは、クローン元の "git remote" ("origin" という名前) に対応します。 リモートの各ブランチは、これらのブランチによって正確に追跡されます。 これらのリモート追跡ブランチでは絶対に作業しないでください。 ローカルブランチでのみ作業します。 ローカルブランチは、指定されたリモート追跡ブランチから (プル時に)自動マージするように構成できます。 これは、リモート追跡ブランチ origin/blead からマージするように 構成されているデフォルトブランチ blead の場合です。

You can see recent commits:


  % git log

And pull new changes from the repository, and update your local repository (must be clean first)

リポジトリから新しい変更をプルし、ローカルリポジトリを更新します (最初にクリーンにする必要があります)。

  % git pull

Assuming we are on the branch blead immediately after a pull, this command would be more or less equivalent to:

プルの直後にブランチ blead にいると仮定すると、このコマンドは 以下とほぼ等価になります:

  % git fetch
  % git merge origin/blead

In fact if you want to update your local repository without touching your working directory you do:

実際、作業ディレクトリにアクセスせずにローカルリポジトリを更新したい場合は、 次のようにします:

  % git fetch

And if you want to update your remote-tracking branches for all defined remotes simultaneously you can do

また、定義されたすべてのリモートに対してリモート追跡ブランチを 同時に更新したい場合は、以下のように行うことができます:

  % git remote update

Neither of these last two commands will update your working directory, however both will update the remote-tracking branches in your repository.

最後の二つのコマンドはどちらも作業ディレクトリを更新しませんが、どちらも リポジトリ内のリモート追跡ブランチを更新します。

To switch to another branch:


  % git checkout origin/maint-5.8-dor

To make a local branch of a remote branch:


  % git checkout -b maint-5.10 origin/maint-5.10

To switch back to blead:

blead に戻るには:

  % git checkout blead


The most common git command you will use will probably be

おそらくもっともよく使う git コマンドは:

  % git status

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:

このコマンドは、変更されたファイルや無視されていない 追跡されていないファイルなど、リポジトリの現在の状態の説明を 出力として生成します。 さらに、次のコミットのためにステージングされたファイルや、 通常は変更方法に関する有用な情報を表示します。 たとえば、次のようになります:

  $ git status
  # On branch blead
  # Your branch is ahead of 'origin/blead' by 1 commit.
  # Changes to be committed:
  #   (use "git reset HEAD <file>..." to unstage)
  #       modified:   pod/perlrepository.pod
  # Changed but not updated:
  #   (use "git add <file>..." to update what will be committed)
  #       modified:   pod/perlrepository.pod
  # Untracked files:
  #   (use "git add <file>..." to include in what will be committed)
  #       deliberate.untracked

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 blead which has not been pushed to the origin remote yet. NOTE: that this output is also what you see as a template if you do not provide a message to git commit.

これは、コミットのためにステージングされたこの文書に変更があったことと、 まだステージングされていないワーキングディレクトリに さらに変更があったことを示しています。 また、ワーキングディレクトリに追跡されていないファイルが あったことも示しています; また、これらすべてを変更する方法を示しています。 また、origin リモートにまだプッシュされていないワーキングブランチ blead に一つのコミットがあることも示しています。 : この出力は、git commit にメッセージを提供しない場合に テンプレートとして表示されるものでもあります。

Assuming we commit all the mentioned changes above:


  % git commit -a -m'explain git status and stuff about remotes'
  Created commit daf8e63: explain git status and stuff about remotes
   1 files changed, 83 insertions(+), 3 deletions(-)

We can re-run git status and see something like this:

git status を再実行して、以下のようなものが得られます:

  % git status
  # On branch blead
  # Your branch is ahead of 'origin/blead' by 2 commits.
  # 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)

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.

何か疑問がある場合には、何かをする前に自分のステータスをチェックして 注意深く読んでください; 多くの疑問に対しては、git status 出力が直接答えてくれます。


If you have a patch in mind for Perl, you should first get a copy of the repository:

Perl 用のパッチを考えている場合は、まずリポジトリのコピーを 入手する必要があります。

  % git clone git://perl5.git.perl.org/perl.git perl-git

Then change into the directory:


  % cd perl-git

Alternatively, if you already have a Perl repository, you should ensure that you're on the blead branch, and your repository is up to date:

あるいは、すでに Perl リポジトリを持っている場合は、 blead ブランチにいて、リポジトリが最新であることを確認する必要があります:

  % git checkout blead
  % git pull

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.

最新の blead バージョンに対してパッチを適用することをお勧めします。 これは、重大なバグ修正以外のすべての変更に対して新たな開発が行われる 場所であるためです。 重大なバグ修正パッチは、関連するメインブランチに対して作成するか、 修正が適用されるすべてのブランチを示すメモとともに提出する必要があります。

Now that we have everything up to date, we need to create a temporary new branch for these changes and switch into it:

すべてが最新の状態になったので、これらの変更に対して一時的な 新しいブランチを作成し、そのブランチに切り替える必要があります:

  % git checkout -b orange

which is the short form of


  % git branch orange
  % git checkout orange

Then make your changes. For example, if Leon Brocard changes his name to Orange Brocard, we should change his name in the AUTHORS file:

次に、変更を加えます。 たとえば、Leon Brocard が名前を Orange Brocard に変更した場合、 AUTHORS ファイル内の名前を変更する必要があります:

  % perl -pi -e 's{Leon Brocard}{Orange Brocard}' AUTHORS

You can see what files are changed:


  % git status
  # On branch orange
  # Changes to be committed:
  #   (use "git reset HEAD <file>..." to unstage)
  #     modified:   AUTHORS

And you can see the changes:


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

Now commit your change locally:


  % git commit -a -m 'Rename Leon Brocard to Orange Brocard'
  Created commit 6196c1d: Rename Leon Brocard to Orange Brocard
   1 files changed, 1 insertions(+), 1 deletions(-)

You can examine your last commit with:


  % git show HEAD

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:

説明またはパッチ自体に満足できない場合は、ファイルをもう一度編集してから 次のコマンドを発行することで修正できます:

  % git commit -a --amend

Now you should create a patch file for all your local changes:


  % git format-patch origin

You should now send an email to perl5-porters@perl.org with a description of your changes, and include this patch file as an attachment.

perl5-porters@perl.org に電子メールを送信して、変更内容を説明し、 このパッチファイルを添付ファイルとして添付してください。

If you want to delete your temporary branch, you may do so with:


  % git checkout blead
  % git branch -d orange
  error: The branch 'orange' is not an ancestor of your current HEAD.
  If you are sure you want to delete it, run 'git branch -D orange'.
  % git branch -D orange
  Deleted branch orange.


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 utils/perldoc.PL rather than utils/perldoc. Similarly, don't create patches for files under $src_root/ext from their copies found in $install_root/lib. If you are unsure about the proper location of a file that may have gotten copied while building the source distribution, consult the MANIFEST.

ディストリビューション内の多くのファイルは 派生的なものであることに注意してください -- それらのファイルにパッチを当てることは避けてください; なぜなら、git はそれらに対する変更を見ることができず、 ビルドプロセスがそれらを上書きするからです。 代わりにオリジナルにパッチを当ててください。 ほとんどのユーティリティ(perldoc など)はこのカテゴリにあります; すなわち、utils/perldoc ではなく utils/perldoc.PL にパッチを当てます。 同様に、$install_root/lib にあるコピーから $src_root/ext 以下のファイルに パッチを作成しないでください。 ソースディストリビューションのビルド中にコピーされた可能性のあるファイルの 適切な場所がわからない場合は、MANIFEST を調べてください。


Since the patch(1) utility cannot deal with binary files, it's important that you either avoid the use of binary files in your patch, generate the files dynamically, or that you encode any binary files using the uupacktool.pl utility.

patch(1) ユーティリティはバイナリファイルを扱うことができないので、 パッチでバイナリファイルを使わないようにするか、 ファイルを動的に生成するか、uupacktool.pl ユーティリティを使って バイナリファイルをエンコードするかのいずれかを行うことが重要です。

Assuming you needed to include a gzip-encoded file for a module's test suite, you might do this as follows using the uupacktool.pl utility:

モジュールのテストスイートに gzip でエンコードされたファイルを含める 必要がある場合は、uupacktool.pl ユーティリティを使用して、 次のように行うことができます:

    $ perl uupacktool.pl -v -p -D lib/Some/Module/t/src/t.gz
    Writing lib/Some/Module/t/src/t.gz into lib/Some/Module/t/src/t.gz.packed

This will replace the t.gz file with an encoded counterpart. During make test, before any tests are run, perl's Makefile will restore all the .packed files mentioned in the MANIFEST to their original name. This means that the test suite does not need to be aware of this packing scheme and will not need to be altered.

これは、t.gz ファイルを対応するエンコードされたファイルに置き換えます。 make test 中、テストが実行される前に、perl の Makefile は MANIFEST に記述されているすべての .packed ファイルを元の名前に復元します。 これは、テストスイートがこのパッキングスキームを認識する必要がなく、 変更する必要もないことを意味します。


The first thing you should include with your patch is a description of the problem that the patch corrects. If it is a code patch (rather than a documentation patch) you should also include a small test case that illustrates the bug (a patch to an existing test file is preferred).

パッチに最初に含める必要があるのは、パッチによって修正される問題の説明です。 (文書パッチではなく)コードパッチの場合は、 バグを説明する小さなテストケースも含める必要があります (既存のテストファイルへのパッチが推奨されます)。

If you are submitting a code patch there are several other things that you need to do.


Comments, Comments, Comments


Be sure to adequately comment your code. While commenting every line is unnecessary, anything that takes advantage of side effects of operators, that creates changes that will be felt outside of the function being patched, or that others may find confusing should be documented. If you are going to err, it is better to err on the side of adding too many comments than too few.

コードに適切なコメントを付けるようにしてください。 すべての行にコメントを付ける必要はありませんが、演算子の副作用を利用するもの、 パッチされている関数の外部で感じられる変更を生成するもの、 または他の人が混乱を感じる可能性のあるものはすべて 文書化する必要があります。 過ちを起こす場合は、コメントの数が少なすぎる過ちよりも、 コメントの数が多すぎる過ちの方がましです。



In general, please follow the particular style of the code you are patching.


In particular, follow these general guidelines for patching Perl sources:

特に、Perl ソースにパッチを適用する場合は、次の一般的なガイドラインに 従ってください:

    8-wide tabs (no exceptions!)
    4-wide indents for code, 2-wide indents for nested CPP #defines
    try hard not to exceed 79-columns
    ANSI C prototypes
    uncuddled elses and "K&R" style for indenting control constructs
    no C++ style (//) comments
    mark places that need to be revisited with XXX (and revisit often!)
    opening brace lines up with "if" when conditional spans multiple
        lines; should be at end-of-line otherwise
    in function definitions, name starts in column 0 (return value is on
        previous line)
    single space after keywords that are followed by parens, no space
        between function name and following paren
    avoid assignments in conditionals, but if they're unavoidable, use
        extra paren, e.g. "if (a && (b = c)) ..."
    "return foo;" rather than "return(foo);"
    "if (!foo) ..." rather than "if (foo == FALSE) ..." etc.


When submitting a patch you should make every effort to also include an addition to perl's regression tests to properly exercise your patch. Your testsuite additions should generally follow these guidelines (courtesy of Gurusamy Sarathy <gsar@activestate.com>):

パッチを送信する際には、perl の退行テストを追加して、 パッチを適切に適用するように、あらゆる努力を払う必要があります。 テストスイートの追加は、一般的に次のガイドラインに従う必要があります (Gurusamy Sarthy <gsar@activestate.com> による):

    Know what you're testing.  Read the docs, and the source.
    Tend to fail, not succeed.
    Interpret results strictly.
    Use unrelated features (this will flush out bizarre interactions).
    Use non-standard idioms (otherwise you are not testing TIMTOWTDI).
    Avoid using hardcoded test numbers whenever possible (the
      EXPECTED/GOT found in t/op/tie.t is much more maintainable,
      and gives better failure reports).
    Give meaningful error messages when a test fails.
    Avoid using qx// and system() unless you are testing for them.  If you
      do use them, make sure that you cover _all_ perl platforms.
    Unlink any temporary files you create.
    Promote unforeseen warnings to errors with $SIG{__WARN__}.
    Be sure to use the libraries and modules shipped with the version
      being tested, not those that were already installed.
    Add comments to the code explaining what you are testing for.
    Make updating the '1..42' string unnecessary.  Or make sure that
      you update it.
    Test _all_ behaviors of a given operator, library, or function:
      - All optional arguments
      - Return values in various contexts (boolean, scalar, list, lvalue)
      - Use both global and lexical variables
      - Don't forget the exceptional, pathological cases.


If you have received a patch file generated using the above section, you should try out the patch.

前述の節でを使って生成されたパッチファイルを受け取った場合は、 パッチを試してみてください。

First we need to create a temporary new branch for these changes and switch into it:

まず、これらの変更のための一時的な新しいブランチを作成し、そのブランチに 切り替える必要があります:

  % git checkout -b experimental

Patches that were formatted by git format-patch are applied with git am:

git format-patch でフォーマットされたパッチは、git am で適用されます:

  % git am 0001-Rename-Leon-Brocard-to-Orange-Brocard.patch
  Applying Rename Leon Brocard to Orange Brocard

If just a raw diff is provided, it is also possible use this two-step process:

生の diff だけが提供されている場合は、次の 2 段階のプロセスを 使用することもできます:

  % git apply bugfix.diff
  % git commit -a -m "Some fixing" --author="That Guy <that.guy@internets.com>"

Now we can inspect the change:


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

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:

もしあなたが Perl のコミッタで、パッチが良いものだと思うなら、 それを blead にマージしてメインのリポジトリにプッシュすることができます:

  % git checkout blead
  % git merge experimental
  % git push

If you want to delete your temporary branch, you may do so with:


  % git checkout blead
  % git branch -d experimental
  error: The branch 'experimental' is not an ancestor of your current HEAD.
  If you are sure you want to delete it, run 'git branch -D experimental'.
  % git branch -D experimental
  Deleted branch experimental.


The command git clean can with varying arguments be used as a replacement for make clean.

git clean コマンドはさまざまな引数で make clean の代わりに 使うことができます。

To reset your working directory to a pristine condition you can do:


  git clean -dxf

However, be aware this will delete ALL untracked content. You can use

ただし、これによりすべての追跡されていないコンテンツが削除されます。 次のようにすると:

  git clean -Xf

to remove all ignored untracked files, such as build and test byproduct, but leave any manually created files alone.

ビルドやテストの副産物など、すべての無視された 追跡されていないファイルを削除します。 ただし、手動で作成したファイルは残します。

If you only want to cancel some uncommitted edits, you can use git checkout and give it a list of files to be reverted, or git checkout -f to revert them all.

コミットされていない編集だけをキャンセルしたい場合は、 git checkout を使用して元に戻すファイルのリストを与えるか、 git checkout -f を使用してすべてを元に戻すことができます。

If you want to cancel one or several commits, you can use git reset.

1つまたは複数のコミットをキャンセルしたい場合は、git reset を 使うことができます。


git provides a built-in way to determine, with a binary search in the history, which commit should be blamed for introducing a given bug.

git には、履歴の二分検索を使って、どのコミットが特定のバグを 引き起こしたと非難されるべきかを判断する手段が組み込まれています。

Suppose that we have a script ~/testcase.pl that exits with 0 when some behaviour is correct, and with 1 when it's faulty. We need an helper script that automates building perl and running the testcase:

スクリプト ~/testcase.pl があり、動作が正しい場合は 0 で終了し、 動作が正しくない場合は 1 で終了するとします。 perl の構築とテストケースの実行を自動化するヘルパースクリプトが必要です:

  % cat ~/run
  git clean -dxf
  # If you can use ccache, add -Dcc=ccache\ gcc -Dld=gcc to the Configure line
  sh Configure -des -Dusedevel -Doptimize="-g"
  test -f config.sh || exit 125
  # Correct makefile for newer GNU gcc
  perl -ni -we 'print unless /<(?:built-in|command)/' makefile x2p/makefile
  # if you just need miniperl, replace test_prep with miniperl
  make -j4 test_prep
  -x ./perl || exit 125
  ./perl -Ilib ~/testcase.pl
  git clean -dxf
  exit $ret

This script may return 125 to indicate that the corresponding commit should be skipped. Otherwise, it returns the status of ~/testcase.pl.

このスクリプトは、対応するコミットをスキップすることを示す 125 を 返す場合があります。 それ以外の場合は、~/testcase.plのステータスを返します。

We first enter in bisect mode with:

まず bisect モードに入ります:

  % git bisect start

For example, if the bug is present on HEAD but wasn't in 5.10.0, git will learn about this when you enter:

例えば、バグが HEAD にあっても 5.10.0 にはなかった場合、git は 以下のように入力することでこれを学習します:

  % git bisect bad
  % git bisect good perl-5.10.0
  Bisecting: 853 revisions left to test after this

This results in checking out the median commit between HEAD and perl-5.10.0. We can then run the bisecting process with:

この結果、HEADperl-5.10.0 の中間のコミットが チェックアウトされます。 次のようにして bisect 処理を実行します:

  % git bisect run ~/run

When the first bad commit is isolated, git bisect will tell you so:

最初の不正なコミットが分離されると、git bisect は次のように言います:

  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

You can peek into the bisecting process with git bisect log and git bisect visualize. git bisect reset will get you out of bisect mode.

git bisect loggit bisect visualize で bisect 処理を 覗き見ることができます。 git bisect resetは bisect モードを解除します。

Please note that the first good state must be an ancestor of the first bad state. If you want to search for the commit that solved some bug, you have to negate your test case (i.e. exit with 1 if OK and 0 if not) and still mark the lower bound as good and the upper as bad. The "first bad commit" has then to be understood as the "first commit where the bug is solved".

最初の good 状態は、最初の bad 状態の祖先である必要があることに 注意してください。 何らかのバグを 解決した コミットを検索したい場合は、テストケースを 反転させ、 (つまり、OK なら 1 で終了し、そうでないなら 0 で終了する)、 下限を good、上限を bad とマークする必要があります。 「最初の不正なコミット」は、「バグが解決された最初のコミット」と 解釈する必要があります。

git help bisect has much more information on how you can tweak your binary searches.

git help bisect には、二分探索を微調整する方法に関する情報が豊富に 用意されています。

GitHub 経由でパッチを投稿する

GitHub is a website that makes it easy to fork and publish projects with Git. First you should set up a GitHub account and log in.

GitHub は、Git でプロジェクトをフォークして公開することを容易にする ウェブサイトです。 まず、GitHub アカウントを設定してログインする必要があります。

Perl's git repository is mirrored on GitHub at this page:

Perl の git リポジトリは GitHub のこのページにミラーリングされています:


Visit the page and click the "fork" button. This clones the Perl git repository for you and provides you with "Your Clone URL" from which you should clone:

このページにアクセスして、"fork"ボタンをクリックしてください。 これは Perl git リポジトリをクローンし、クローン元の "Your Clone URL" を 提供します:

  % git clone git@github.com:USERNAME/perl.git perl-github

We shall make the same patch as above, creating a new branch:


  % cd perl-github
  % git remote add upstream git://github.com/github/perl.git
  % git pull upstream blead
  % git checkout -b orange
  % perl -pi -e 's{Leon Brocard}{Orange Brocard}' AUTHORS
  % git commit -a -m 'Rename Leon Brocard to Orange Brocard'
  % git push origin orange

The orange branch has been pushed to GitHub, so you should now send an email to perl5-porters@perl.org with a description of your changes and the following information:

orange ブランチは GitHub にプッシュされたので、perl5-porters@perl.org に 変更内容および以下の情報をメール送信してください:

  git@github.com:USERNAME/perl.git branch orange

GitHub 経由のブランチをマージする

If someone has provided a branch via GitHub and you are a committer, you should use the following in your perl-ssh directory:

誰かが GitHub 経由でブランチを提供しており、あなたがコミッタである場合、 perl-ssh ディレクトリで以下を使用する必要があります:

  % git remote add dandv git://github.com/dandv/perl.git
  % git fetch

Now you can see the differences between the branch and blead:

これで、そのブランチと blead の差分を見られるようになりました:

  % git diff dandv/blead

And you can see the commits:


  % git log dandv/blead

If you approve of a specific commit, you can cherry pick it:


  % git cherry-pick 3adac458cb1c1d41af47fc66e67b49c8dec2323f

Or you could just merge the whole branch if you like it all:


  % git merge dandv/blead

And then push back to the repository:


  % git push


Maintenance versions should only be altered to add critical bug fixes.


To commit to a maintenance version of perl, you need to create a local tracking branch:

perl のメンテナンスバージョンにコミットするには、 ローカル追跡ブランチを作成する必要があります。

  % git checkout --track -b maint-5.005 origin/maint-5.005

This creates a local branch named maint-5.005, which tracks the remote branch origin/maint-5.005. Then you can pull, commit, merge and push as before.

これにより、リモートブランチ origin/maint-5.005 を追跡する maint-5.005 という名前のローカルブランチが作成されます。 次に、以前と同じようにプル、コミット、マージ、プッシュを行うことができます。

You can also cherry-pick commits from blead and another branch, by using the git cherry-pick command. It is recommended to use the -x option to git cherry-pick in order to record the SHA1 of the original commit in the new commit message.

git cherry-pick コマンドを使用して、blead と別のブランチから コミットをチェリーピックすることもできます。 元のコミットの SHA1 を新しいコミットメッセージに記録するために、 git cherry-pick-x オプションを使うことを勧めます。


The git documentation, accessible via git help command.

git help command でアクセスできる git 文書。