Creating Pull Requests

もともと、Linux Kernelのソースコードの一部なので、GPLv2扱いになる（はずの認識）。

> https://www.kernel.org/doc/html/latest/index.html
> 
> Licensing documentation
> 
> The following describes the license of the Linux kernel source code (GPLv2), how to properly mark the license of individual files in the source tree, as well as links to the full license text.
> 
> https://www.kernel.org/doc/html/latest/process/license-rules.html#kernel-licensing

https://www.kernel.org/doc/html/latest/maintainer/pull-requests.html

# Creating Pull Requests

> This chapter describes how maintainers can create and submit pull requests to other maintainers. This is useful for transferring changes from one maintainers tree to another maintainers tree.

この章では、どうやってメンテナーが他のメンテナーに対して、pull requestを作成し送信するのかについて記述します。これはあるメンテナーのtreeから別のメンテナーのツリーに対して修正を転送するのに役立ちます。

> This document was written by Tobin C. Harding (who at that time, was not an experienced maintainer) primarily from comments made by Greg Kroah-Hartman and Linus Torvalds on LKML. Suggestions and fixes by Jonathan Corbet and Mauro Carvalho Chehab. Misrepresentation was unintentional but inevitable, please direct abuse to Tobin C. Harding me＠tobin.cc.

この文章は、LKMLにおいてGreg Kroah-Hartman and Linus Torvaldsが行ったコメントから、Tobin C. Hardingによって記述されました（この時はまだ、熟練のメンテナーではなかった）。Jonathan Corbet and Mauro Carvalho Chehabによって提案と修正が行われました。記載ミスなどは意図的ではありませんが、避けられないものです。もし間違いに気が付いたら、 Tobin C. Harding me＠tobin.ccまでご連絡ください。

Original email thread:

`http://lkml.kernel.org/r/20171114110500.GA21175@kroah.com`

.

# Create Branch

> To start with you will need to have all the changes you wish to include in the pull request on a separate branch. Typically you will base this branch off of a branch in the developers tree whom you intend to send the pull request to.

最初に、pull requestに含めようとしているすべての修正を、異なるbranchに含める必要があります。一般的には、あなたはpull requestの送信元となる開発用ツリーのブランチに基づきます。

> In order to create the pull request you must first tag the branch that you have just created. It is recommended that you choose a meaningful tag name, in a way that you and others can understand, even after some time. A good practice is to include in the name an indicator of the subsystem of origin and the target kernel version.

pull requestを作成するためには、先ほど作成したbranchに最初にtagをつける必要があります。tag nameには、しばらく時間が経過した後でも他人が理解できるものをつけることを推奨します。良い方法としては、名前にoriginのsubsystemやターゲットとなるkernel versionを含めることが推奨されます。

> Greg offers the following. A pull request with miscellaneous stuff for drivers/char, to be applied at the Kernel version 4.15-rc1 could be named as char-misc-4.15-rc1. If such tag would be produced from a branch named char-misc-next, you would be using the following command:

Gregは以下を申し込むとします。drivers/charを含むそのほかの要素（miscellaneous）に対する、kernel version 4.15-rc1 に対するpull requestは、char-misc-4.15-rc1と名付けられます。そのようなタグが、char-misc-nextと名付けられたブランチから提供される場合、下記コマンドを実行してください。

`git tag -s char-misc-4.15-rc1 char-misc-next`

> that will create a signed tag called char-misc-4.15-rc1 based on the last commit in the char-misc-next branch, and sign it with your gpg key (see Documentation/maintainer/configure-git.rst).

char-misc-next branchの再度のcommitを基本とした、char-misc-4.15-rc1と呼ばれるsigned tagが作成されます。それは、あなたのgpg keyによってsignされています（ Documentation/maintainer/configure-git.rst を参照してください）

> Linus will only accept pull requests based on a signed tag. Other maintainers may differ.

Linusはsigned tagに基づくpull requestだけを許可します。他のメンテナーは違うかもしれません。

.

> When you run the above command git will drop you into an editor and ask you to describe the tag. In this case, you are describing a pull request, so outline what is contained here, why it should be merged, and what, if any, testing has been done. All of this information will end up in the tag itself, and then in the merge commit that the maintainer makes if/when they merge the pull request. So write it up well, as it will be in the kernel tree for forever.

先ほどのコマンドを実行すると、gitはあなたに対してeditorを開き、tagの詳細を記述するように要求してきます。この場合、あなたはpull requestを記述してください。「ここには何が含まれているのか」「なぜマージする必要があるのか」「もしあればどのようにテストが行われたのか」の概略を含めてください。この情報の全てが、tag自身に含まれ、そのあとでメンテナーがpull requestをマージする際に、メンテナーが行うマージリクエストになります。カーネルツリーに将来にわたって残るので、上手に記載してください。

As said by Linus:

> > Anyway, at least to me, the important part is the *message*. I want to understand what I'm pulling, and why I should pull it. I also want to use that message as the message for the merge, so it should not just make sense to me, but make sense as a historical record too.
>
> とにかく、少なくとも私にとっては、重要な事とは"message"です。私は、何をpullしているので、どうしてpullしなければならないのかを理解したいです。私はまた、mergeに対するmessageとして使いたいとも考えており、 自分にとって意味があるだけでなく、履歴としても意味があるはずです。
>
> > Note that if there is something odd about the pull request, that should very much be in the explanation. If you're touching files that you don't maintain, explain _why_. 
>
> pull requestについて何か違和感がある場合、それは説明に現れます。もしあなたがmaintainしていないファイルに操作する場合には、「なぜ」を明言してください。
>
> > I will see it in the diffstat anyway, and if you didn't mention it, I'll just be extra suspicious.  And when you send me new stuff after the merge window (or even bug-fixes, but ones that look scary), explain not just what they do and why they do it, but explain the _timing_. What happened that this didn't go through the merge window..
>
> 私は、とにかくdiffstatによって確認します、そして言及をしなかったとしたら、私はもっと疑いを持ちます。また、merge window(あるいはバグフィックスだが、それが非常に危ないものに見える）を送った後に、あなたが新しいstuffを、送信してきた場合、「何をするのか」「なぜそうするのか」に加えて、「タイミング」についても説明してください。なぜこれがmerge windowを通過しなかったのかを。
>
> >　I will take both what you write in the email pull request _and_ in the signed tag, so depending on your workflow, you can either describe your work in the signed tag (which will also automatically make it into the pull request email), or you can make the signed tag just a placeholder with nothing interesting in it, and describe the work later when you actually send me the pull request.
> 
> メールのpull requestと、署名済みタグの両方を使用するので、ワークフローに応じて、署名済みタグ内にあなたのworkを記述できます（pull requestのメールにも自動的に送信されます）。 または、署名付きタグを、何も興味深いものを含まないプレースホルダーにして、後でプルリクエストを実際に送信するときに、その作業を説明することもできます。
>
> >And yes, I will edit the message. Partly because I tend to do just trivial formatting (the whole indentation and quoting etc), but partly because part of the message may make sense for me at pull time (describing the conflicts and your personal issues for sending it right now), but may not make sense in the context of a merge commit message, so I will try to make it all make sense. 
>
> おしてもちろん、私はmessageを編集します。些細な書式設定（インデントや引用全体）を行うこともありますが、messageの一部がpull時に理解できる場合もあります（conflictとすぐに送信しようとしている個人的な問題について尾辺ています）。merge commit messageのコンテクストは意味をなさないので、私はそれを意味あるものにしようとします。
>
>> I will also fix any speeling mistaeks and bad grammar I notice, particularly for non-native speakers (but also for native ones
;^). But I may miss some, or even add some.
>
> 特にネイティブスピーカーでない場合（ネイティブスピーカーである場合も）、気が付くような誤字(speeling mistaeks)や不適切な文法も修正します。
> ただし、私はいくつかを逃したり、いくつかを追加したりもします。
>
> Linus

Greg gives, as an example pull request:

> >Char/Misc patches for 4.15-rc1
>
> > Here is the big char/misc patch set for the 4.15-rc1 merge window. 
>
> 4.15-rc1 merge windowに対し、char/misc patch ∧に対する大きな修正があります。
> 
> > Contained in here is the normal set of new functions added to all of these crazy drivers, as well as the following brand new subsystems: 
>
> ここには、全てのcrazyなdriverに追加された通常の新機能セットと、次の新しいsubsystemが含まれます。
> 
> > - time_travel_controller: Finally a set of drivers for the
latest time travel bus architecture that provides i/o to           the CPU before it asked for it, allowing uninterrupted           processing
>
> - time_travel_controller : 要求される以前にCPUにI/Oを提供し中断する事の無い処理を実現する最新のtime travel bus architecture用のドライバーセット
>
> > - relativity_shifters: due to the affect that the           time_travel_controllers have on the overall system, there           was a need for a new set of relativity shifter drivers to           accommodate the newly formed black holes that would           threaten to suck CPUs into them.  This subsystem handles           this in a way to successfully neutralize the problems.           There is a Kconfig option to force these to be enabled           when needed, so problems should not occur.
>
> - relativity_shifters：time_travel_controllersがシステム全体に与える影響により、CPUを吸い込む恐れのある新しく形成されたブラックホールに対応するために、新しいrelativity shifter driversのセットが必要でした。 このサブシステムは問題を無力化する方法でこれを処理します。 必要なときにこれらを強制的に有効にするKconfigオプションがあるため、問題は発生しません。
> 
> > All of these patches have been successfully tested in the latest linux-next releases, and the original problems that it found have all been resolved (apologies to anyone living near Canberra for the lack of the Kconfig options in the earlier versions of the linux-next tree creations.)
>
> これらのパッチには、全ての最新のlinux-next releaseでテストされており、見つかった元の問題はすべて解決されています。(linux-netxt tree の最新には該当するKconfig optionが無かったので、Canberraの近くにする方はごめんさい）
> 
> Signed-off-by: Your-name-here <your_email@domain>


> The tag message format is just like a git commit id. One line at the top for a “summary subject” and be sure to sign-off at the bottom.

タグのメッセージ形式は、git commit idに似ています。 上部に1行「概要の件名」、下部には必ずサインオフしてください。

> Now that you have a local signed tag, you need to push it up to where it can be retrieved:

ローカルの署名済みタグを取得したので、それを興すことができる場所まで、pushする必要があります。

` git push origin char-misc-4.15-rc1 `

# Create Pull Request

> The last thing to do is create the pull request message. git handily will do this for you with the git request-pull command, but it needs a bit of help determining what you want to pull, and on what to base the pull against (to show the correct changes to be pulled and the diffstat). The following command(s) will generate a pull request:

最後にするべきことは、プルリクエストメッセージの作成です。gitはgit request-pullコマンドを使用してこれを簡単に行います。ただし、pullする対象と、pullの基準となるものを決定するのに少し助けが必要です（pullされるべき正しい変更と、diffstatを表示するため） 。 次のコマンドは、プルリクエストを生成します。

` git request-pull master git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git/ char-misc-4.15-rc1 `

Quoting Greg:

> > This is asking git to compare the difference from the
'char-misc-4.15-rc1' tag location, to the head of the 'master'
branch (which in my case points to the last location in Linus's tree that I diverged from, usually a -rc release) and to use the git:// protocol to pull from.  If you wish to use https://, that can be used here instead as well (but note that some people behind firewalls will have problems with https git pulls).
>
> これは、gitに対して、'char-misc-4.15-rc1' tag locationから、`master` branchの先頭に対する差分を比較するように、git:// protocolをpullに利用するように要求するものである（私の場合、分岐したlinuxのツリーの最後の場所でした。通常は-rc releaseです）。もし https://をその代わりに使いたい場合には、置き換えることができます（この場合、https git pullに関するfirewallの問題が一部の人で発生する事に気を付けてください）。
>
> > If the char-misc-4.15-rc1 tag is not present in the repo that I am asking to be pulled from, git will complain saying it is not there, a handy way to remember to actually push it to a public location.
> 
> もしレポジトリにthe char-misc-4.15-rc1 tag が無ければ、pullするときに確認をします、gitはそこにないと不平を示します。実際に、public locationにpushするように記憶しておくことが便利です。
> > The output of 'git request-pull' will contain the location of the git tree and specific tag to pull from, and the full text
description of that tag (which is why you need to provide good information in that tag).  It will also create a diffstat of the pull request, and a shortlog of the individual commits that the pull request will provide.
>
> 'git request-pull'の出力には、gitツリーの場所とpull する特定のタグ、および全文が含まれます。そのタグの説明（そのタグで適切な情報を提供する必要があるのはそのためです）。 また、pull requestのdiffstatと、pull requestが提供する個々のコミットのショートログも作成します。

> Linus responded that he tends to prefer the git:// protocol. Other maintainers may have different preferences. Also, note that if you are creating pull requests without a signed tag then https:// may be a better choice. Please see the original thread for the full discussion.

Linusはgit://プロトコルを好む傾向があると答えました。 他のメンテナーは別の好みを持っているかもしれません。 また、署名付きタグなしでpull requestを作成する場合は、https://方が適している場合があることに注意してください。 詳細については、元のスレッドをご覧ください。

# Submit Pull Request

> A pull request is submitted in the same way as an ordinary patch. Send as inline email to the maintainer and CC LKML and any sub-system specific lists if required. Pull requests to Linus typically have a subject line something like:

pull requestは通常のパッチと同じ方法で送信されます。 インラインメールとしてメンテナーに送信し、必要に応じてCC LKMLとサブシステム固有のリストを送信します。 通常、Linusへのプルリクエストには、次のような件名があります。

` [GIT PULL] <subsystem> changes for v4.15-rc1 `