セットアップと設定
プロジェクトの取得と作成
基本的なスナップショット
ブランチとマージ
プロジェクトの共有と更新
検査と比較
パッチ適用
デバッグ
メール
外部システム
サーバー管理
- 2.48.1 → 2.50.1 変更なし
-
2.48.0
2025-01-10
- 2.46.1 → 2.47.3 変更なし
-
2.46.0
2024-07-29
- 2.45.4 変更なし
-
2.45.3
2024-11-26
- 2.45.1 → 2.45.2 変更なし
-
2.45.0
2024-04-29
- 2.43.2 → 2.44.4 変更なし
-
2.43.1
2024-02-09
-
2.43.0
2023-11-20
- 2.42.1 → 2.42.4 変更なし
-
2.42.0
2023-08-21
- 2.41.1 → 2.41.3 変更なし
-
2.41.0
2023-06-01
- 2.38.3 → 2.40.4 変更なし
-
2.38.2
2022-12-11
- 2.36.3 → 2.38.1 変更なし
-
2.36.2
2022-06-23
- 2.36.1 変更なし
-
2.36.0
2022-04-18
- 2.35.1 → 2.35.8 変更なし
-
2.35.0
2022-01-24
- 2.34.2 → 2.34.8 変更なし
-
2.34.1
2021-11-24
- 2.33.1 → 2.34.0 変更なし
-
2.33.0
2021-08-16
- 2.32.1 → 2.32.7 変更なし
-
2.32.0
2021-06-06
- 2.30.2 → 2.31.8 変更なし
-
2.30.1
2021-02-08
-
2.30.0
2020-12-27
- 2.28.1 → 2.29.3 変更なし
-
2.28.0
2020-07-27
- 2.25.1 → 2.27.1 変更なし
-
2.25.0
2020-01-13
- 2.24.1 → 2.24.4 変更なし
-
2.24.0
2019-11-04
- 2.22.1 → 2.23.4 変更なし
-
2.22.0
2019-06-07
- 2.20.1 → 2.21.4 変更なし
-
2.20.0
2018-12-09
- 2.19.1 → 2.19.6 変更なし
-
2.19.0
2018-09-10
- 2.18.1 → 2.18.5 変更なし
-
2.18.0
2018-06-21
- 2.17.0 → 2.17.6 変更なし
-
2.16.6
2019-12-06
-
2.15.4
2019-12-06
- 2.14.6 変更なし
-
2.13.7
2018-05-22
-
2.12.5
2017-09-22
- 2.10.5 → 2.11.4 変更なし
-
2.9.5
2017-07-30
-
2.8.6
2017-07-30
- 2.4.12 → 2.7.6 変更なし
-
2.3.10
2015-09-28
-
2.2.3
2015-09-04
- 2.1.4 変更なし
-
2.0.5
2014-12-17
この情報は Git プロジェクトに固有のものです
この情報は、Git プロジェクト自体に貢献する予定がある場合にのみ関連することにご注意ください。通常の Git ユーザーにとって必読ではありません。
ガイドライン
このプロジェクトに貢献するためのガイドラインをいくつか示します。これらのガイドラインの多くを網羅したステップバイステップのチュートリアルも利用可能です。
パッチシリーズの典型的なライフサイクル
このドキュメントで後述するさまざまなガイドラインの背景にある理由を理解するために、まず、このプロジェクトにおける典型的なパッチシリーズのライフサイクルがどのように進むかを理解しましょう。
-
あなたは課題を思いつき、それをコード化します。これを行うのにプロジェクトからの事前の承認は必要ありません。
あなたのパッチはメーリングリスト上の他の貢献者によってレビューされ、レビューは、パッチの背後にある一般的なアイデア(「そもそも解決する価値のある問題なのか?」を含む)、ソリューションの設計の理由、実際の実装など、さまざまなことのメリットを評価するために行われます。ここに示されているガイドラインは、レビュアーがパッチを理解しやすくすることで、パッチを支援するためにあります。
-
変更について知る必要があるかもしれない人々に cc を付けて、パッチをリストに送ります。あなたの目標は、あなたが構築しているものが優れていると他の人を**必ずしも**説得することではありません。あなたの目標は、あなた一人で構築できるものよりも優れた「課題」の解決策を考案する上で助けを得ることです。
知る必要があるかもしれない人々とは、あなたが触っているコードを開発した人々です。これらの人々は、あなたを助けるのに十分な知識を持っている可能性が最も高い人々ですが、彼らにはあなたを助ける義務はありません(つまり、あなたは彼らに助けを求めますが、要求はしません)。
git
log
-p
--
$area_you_are_modifying
は、彼らが誰であるかを特定するのに役立ちます。 -
改善のためのコメントや提案が寄せられます。場合によっては、「あなたの変更の上に」パッチ形式でそれらを受け取ることもあります。更新されたパッチセットを作成する際にそれらを考慮しつつ、メーリングリストで「全員に返信」で応答することが期待されます。
-
パッチを磨き、洗練し、リストと、パッチの改善に時間を費やした人々に再送します。(2)のステップに戻ります。
-
上記の反復によってパッチが改善される一方で、メンテナーはリストからパッチを取得し、
seen
ブランチにキューに入れることがあります。これは、人々が自分でパッチを取得してツリーに適用する必要なく、簡単に試せるようにするためです。seen
にあることには他の意味はありません。特に、パッチが「承認された」ことを意味するものでは決してありません。 -
議論によって、パッチの最新の反復が十分に良い状態にあるという合意に達すると、メンテナーはそのトピックを、週に数回メーリングリストに送信される「What’s cooking」レポートに含め、「Will merge to next.」とマークします。この決定は、主にメンテナーがレビュー議論に参加した人々の助けを借りて行われます。
-
パッチが next ブランチにマージされた後も、さらにパッチを追加して改善を続けることができますが、トピックが next にマージされる頃には、そのトピックの範囲と基本的な方向性が適切であることに全員が同意していると想定されます。そのため、このような増分更新は、小さな修正と改善に限定されます。トピックが next でしばらくの間(例えば、7暦日)さらに調整を必要とせずに成熟した後、master ブランチにマージされ、次のメジャーリリースの一部になるのを待ちます。
以下のセクションでは、このようなライフサイクルでパッチが効果的にレビューされるのを助けるための多くの技術と慣習がリストされています。
開始点を選択してください。
予備的なステップとして、まず作業の開始点を選択する必要があります。通常、これはブランチを選択することを意味しますが、技術的には特定のコミット(通常はブランチの HEAD、または先端)です。
注意すべき重要なブランチがいくつかあります。具体的には、gitworkflows[7] で議論されているように、4つの統合ブランチがあります。
-
maint
-
master
-
next
-
seen
リストの下にあるブランチは、通常、それより上位のブランチの子孫です。たとえば、maint
は master
よりも「古い」ブランチです。なぜなら、master
は通常 maint
の上にパッチ(コミット)を持っているからです。
また、他の貢献者からの作業を含む「トピック」ブランチもあります。トピックブランチは、Gitメンテナー(のフォーク)によって、メーリングリスト上の現在の受信中の貢献を整理するために作成され、定期的な「What’s cooking in git.git」アナウンスで項目化されます。トピックブランチの先端を見つけるには、git
log
--first-parent
master..seen
を実行し、マージコミットを探します。このコミットの2番目の親がトピックブランチの先端です。
適切な開始点を選択するための1つの指針があります。一般に、常に変更に関連する最も古い統合ブランチに基づいて作業してください(gitworkflows[7] の「Merge upwards」を参照)。この原則は、ほとんどの場合、新しい作業の開始点は、以下のケースに基づいて maint
または master
の最新の HEAD コミットであるべきだということを意味します。
-
リリース版のバグを修正する場合は、
maint
を開始点として使用してください(これは、最近master
に登場したがリリース版では利用できなかった最先端の新しいAPI機能を使用せずに修正する必要があることを意味するかもしれません)。 -
それ以外の場合(新しい機能を追加する場合など)は
master
を使用してください。
注
|
例外的なケースとして、古いバージョンで導入されたバグが、最近のリリースよりもはるかに古いリリースのユーザーのために修正されなければならない場合があります。git describe --contains X は、バグを導入したコミット X を v2.30.0-rc2-gXXXXXX と記述する場合があります。そして、そのバグは非常に影響が大きいため、「Git 2.41.0」が現在のリリースであるにもかかわらず、Git 2.30.x シリーズの新しいメンテナンスリリースを発行する必要があるかもしれません。そのような場合、2.30.x シリーズのメンテナンスブランチの先端を使用したいと思うかもしれません。これは、メンテナーの「切り離された」リポジトリの maint-2.30 ブランチで利用できるかもしれません。 |
これは、master
への昇格の現実的な機会を望むのであれば、next
や seen
はあなたの作業の不適切な開始点であることを意味します。これらは新しい作業のベースとして使用されるように設計されていません。これらは単に進行中のトピックがうまく機能することを保証するためにのみ存在します。これが、next
と seen
の両方がメーリングリスト上の受信パッチと頻繁に再統合され、以前のバージョンを置き換えるために強制プッシュされる理由です。next
の上に文字通り構築されたトピックは、next
内の他のすべてのトピックを引きずり込まなければ master
にマージすることはできません。その中にはまだ準備ができていないものもあるかもしれません。
例えば、あなたがツリー全体にわたる変更を行っている間に、他の誰かが自身のツリー全体にわたる変更を行っている場合、あなたの作業は他の人の作業と大きく重複する可能性があります。この状況では、next
を開始点として使用したい誘惑に駆られるかもしれません(なぜなら、他の人の作業が含まれているからです)。しかし、そうすると、他の人の作業だけでなく、すでに next
に統合されている他の貢献者からのあらゆるランダムなものすべてに依存することになります。そして、next
が新しいバージョンで更新されるとすぐに、メンテナーがクリーンに適用できるように、あなたの作業すべてはとにかくリベースする必要が生じます。
例外中の例外で、あなたが絶対に next
には存在するが master
には存在しない、選ばれたいくつかのトピックブランチに依存しなければならない場合、master
をフォークし、必要なトピックブランチをそれにマージすることで、独自のカスタムベースブランチを作成したいと思うかもしれません。その後、このベースブランチの上に作業することができます。しかし、このベースブランチはあなただけが知っているプライベートなものであることに留意してください。そのため、パッチをリストに送る準備ができたら、カバーレターでその作成方法を必ず伝えてください。この重要な情報があれば、他の人はあなたのベースブランチを自分の環境で再作成して、あなたの作業を試すことができます。
最後に、システムの一部には、独自のソースコードリポジトリを持つ専門のメンテナーがいることに注意してください(以下の「サブシステム」セクションを参照)。
論理的に独立した変更は個別のコミットにしてください。
あなたのパッチが本当に些細なものでない限り、作業ツリーとコミットヘッドの間で生成されたパッチを送信すべきではありません。代わりに、常に完全なコミットメッセージでコミットを作成し、リポジトリから一連のパッチを生成してください。これは良い習慣です。
変更(複数可)について、人々が実際にパッチテキストを読んでコードが説明をどれだけうまく実行しているかを判断しなくても、それが良いことであるかどうかを判断できる程度に詳細な説明を付けてください。
説明が長くなりすぎたら、おそらくコミットをより細かな部分に分割する必要があるというサインです。とは言え、レビュアーがパッチをチェックするのに役立つこと、そして将来のメンテナーがコードを理解するのに役立つことを簡潔に記述したパッチは、最も美しいパッチです。件名で要点をうまく要約し、変更の動機、変更のアプローチ、そしてもし関連があれば以前のバージョンとどのように実質的に異なるかを記述した説明は、すべて良いものです。
修正するバグのテストがあることを確認してください。t/README
を参照してください。
新しい機能を追加する際は、その機能が本来のタイミングで新しい動作をトリガーすること、そして本来ではないタイミングでトリガーしないことを示す新しいテストがあることを確認してください。コード変更後は、テストスイート全体がパスすることを確認してください。バグを修正する際は、誰かが誤って修正を壊した場合に回帰を防ぐための新しいテストがあることを確認してください。また、作業を next と seen にマージしてみて、テストがまだパスすることを確認してください。進行中の他の人々のトピックは、あなたのトピックでやろうとしていることと予期せぬ相互作用をする可能性があります。
https://github.com/git/git のフォークにプッシュすると、そのCI統合を使用してLinux、Mac、Windowsで変更をテストします。詳細はGitHub CIセクションを参照してください。
更新された動作を説明するためにドキュメントを更新し、結果として得られるドキュメントセットが適切にフォーマットされることを確認することを忘れないでください(Documentation/doc-diff スクリプトを試してください)。
現在、綴りや文法について米語と英国英語の規範が自由に混ざっており、これは多少残念なことです。矛盾を修正するためだけに多くのファイルを修正する大規模なパッチは歓迎されません。そのようなパッチから生じる他の変更との潜在的な衝突は、それだけの価値がありません。私たちは、米語を支持して矛盾を段階的に解消することを好みます。これは、近くの他の実際の作業を行う際の副次的な効果として、小さく消化しやすいパッチで行われます(例:明確にするために段落を書き換えながら、英国英語の綴りを米語に変える)。明らかな誤植の修正(「teh」→「the」)は、他のドキュメント変更とは別の独立したパッチとして提出されることが望ましいですが、より歓迎されます。
ああ、もう一つ。空白については厳しくチェックします。あなたの変更が templates/hooks--pre-commit
に同梱されているサンプルプリコミットフックのエラーをトリガーしないことを確認してください。これを確実にするために、コミットする前に変更に対して git
diff
--check
を実行してください。
変更内容をきちんと記述してください。
変更内容を説明するログメッセージは、変更内容そのものと同じくらい重要です。コードは、周囲のコードとの連携方法を十分に説明するためにコード内コメントで明確に記述されているかもしれませんが、将来コードを修正したり強化したりする必要がある人々は、いくつかの理由からあなたのコードがなぜそのように動作するのかを知る必要があります。
-
あなたのコードは、あなたが望んだものとは異なる動作をしているかもしれません。あなたが実際に達成したかったことを書き留めることで、彼らはあなたのコードを修正し、それが本来すべきことを実行できるようにするのに役立ちます(また、ログメッセージを書いてその背後にある考えを要約しているうちに、あなた自身も自分のバグを発見することがよくあります)。
-
あなたのコードは、あなたの即時のニーズのためにのみ必要なことを行っているかもしれません(例えば、「ディレクトリに対してXを実行する」と書かれているが、ファイルに対して何をするかは実装も設計もしていない)。コードが行わないことをなぜ除外したのかを書き留めることは、将来の開発者を導くのに役立ちます。「ディレクトリに対してXを実行します。なぜならディレクトリには特性Yがあるからです」と書くことは、彼らが「ああ、ファイルも同じ特性Yを持っているから、おそらくそれらに対してXを実行するのも理にかなっているのでは?」と推測するのに役立ちます。「ファイルに対して同じXを実行しないのは、…」と書くことは、彼らがその理由が妥当であるかどうかを判断するのに役立ちます(その場合、彼らはあなたのコードを拡張してファイルをカバーするために時間を無駄にしません)。あるいは、異なる理由を考えるのに役立ちます(その場合、彼らはあなたのコードを拡張してファイルをカバーする理由を説明することができます)。
あなたのログメッセージの目標は、将来の開発者を助けるために、変更の背後にある*理由*を伝えることです。レビュアーはまた、あなたの提案するログメッセージがこの目的に十分に役立つことを確認します。
コミットメッセージの最初の行は短い説明であるべきです(50文字がソフトリミットです。git-commit[1] の DISCUSSION を参照してください)。そして、終止符はスキップすべきです。また、ほとんどの場合、最初の行に「area: 」というプレフィックスを付けるのが慣例です。ここで area は、変更されるコードの一般的な領域のファイル名または識別子です。例えば、
-
doc: sign-off と pgp-signing の区別を明確にする
-
githooks.txt: イントロセクションを改善する
どの識別子を使用すべきか迷った場合は、修正しているファイルで git
log
--no-merges
を実行して、現在の慣例を確認してください。
「area:」プレフィックスの後のタイトル文は、末尾のピリオドを省略し、その最初の単語は、文頭の単語だからという理由以外に大文字にする理由がない限り、大文字にしません。(大文字の省略は、タイトルの「area:」プレフィックスの後の単語にのみ適用されます。) 例: 「doc: clarify...」であって「doc: Clarify...」ではない、または「githooks.txt: improve...」であって「githooks.txt: Improve...」ではない。ただし、「refs: HEAD is also treated as a ref」は正しく、HEAD
は文の途中に出てきても大文字で表記します。
本文には、次のような意味のあるコミットメッセージを提供する必要があります。
-
変更が解決しようとする問題を説明する、つまり、変更なしの現在のコードの何が問題なのかを説明する。
-
変更が問題を解決する方法を正当化する、つまり、変更後の結果がなぜより良いのかを説明する。
-
検討されたが破棄された代替ソリューションがあれば、それらを説明する。
現状を説明する問題文は現在形で書かれます。「コードは入力Yを与えられたときにXを行う」と書き、以前のコードが入力Xを与えられたときにYを行っていた」とは書かないでください。「現在」と言う必要はありません。プロジェクトの慣習により、問題文の現状はあなたの変更**なし**のコードに関するものです。
変更内容を命令形で記述してください。例えば、「[このパッチは] xyzzy に frotz を実行させる」や「[私は] xyzzy を frotz を実行するように変更した」ではなく、「xyzzy に frotz を実行させよ」のように、コードベースにその動作を変更するよう命令しているかのように記述します。説明が外部リソースなしで理解できることを確認してください。メーリングリストのアーカイブへのURLを与えるのではなく、議論の関連するポイントを要約してください。
履歴の「より安定した」部分(つまり、maint
、master
、next
などのブランチ)にある別のコミットを参照したい理由はいくつかあります。
-
修正しているバグの根本原因を導入したコミット。
-
あなたが機能強化している機能を導入したコミット。
-
あなたの作業をテストのために
next
とseen
に試行的にマージしたときに、あなたの作業と競合したコミット。
より安定したブランチ(master
、maint
、next
など)上のコミットを参照する場合、次のように「省略されたハッシュ (件名、日付)」の形式を使用します。
Commit f86a374 (pack-bitmap.c: fix a memleak, 2015-03-30) noticed that ...
gitk の「コミット参照をコピー」コマンドを使うと、この形式(件名が二重引用符で囲まれたもの)を取得できます。または、この git
show
の呼び出しも使えます。
git show -s --pretty=reference <commit>
または、--pretty=reference に対応していない古いバージョンのGitでは、
git show -s --date=short --pretty='format:%h (%s, %ad)' <commit>
Signed-off-by
トレーラーを追加して作業を認証してください
誰が何をしたかをより良く追跡するために、私たちは、パッチを作成したこと、または私たちと同じライセンスでパッチを転送する権利があることを、「サインオフ」することで認証するよう求めています。サインオフなしでは、あなたのパッチを受け入れることはできません。
あなたが以下の D-C-O を証明する場合(かつその場合に限り)、
このプロジェクトに貢献することで、私は次のことを証明します。
貢献は私によって全部または一部作成され、ファイルに示されたオープンソースライセンスの下でそれを提出する権利があること。または、
貢献は、私の知る限り、適切なオープンソースライセンスの下でカバーされている以前の作業に基づいており、私はそのライセンスの下で、その作業を、私によって全部または一部作成された修正を加えて、ファイルに示されたものと同じオープンソースライセンスの下で(異なるライセンスの下で提出が許可されている場合を除く)提出する権利があること。または、
貢献は、(a)、(b)、または (c) を証明した他の人から直接私に提供され、私はそれを変更していないこと。
私は、このプロジェクトと貢献は公開されており、貢献の記録(私が提出するすべての個人情報、サインオフを含む)は無期限に維持され、このプロジェクトまたは関係するオープンソースライセンスと矛盾しない形で再配布される可能性があることを理解し、同意します。
次のような「Signed-off-by」トレーラーをコミットに追加します。
Signed-off-by: Random J Developer <random@developer.example.org>
この行は、Git のコミットコマンドを -s オプションで実行すると追加できます。
他の人のパッチを上記のD-C-Oのルールに従って転送する場合でも、あなた自身の Signed-off-by
トレーラーを配置できることに注意してください。実際、そうすることを推奨します。変更の真の作者に適切に帰属させるために、本文の先頭に「From: 」行を配置することを忘れないでください(上記の(2)を参照)。
この手順はもともとLinuxカーネルプロジェクトから来たものなので、私たちのルールは彼らのものとかなり似ていますが、パッチをサインオフすることが具体的に何を意味するかはプロジェクトによって異なるため、あなたが慣れているプロジェクトとは異なるかもしれません。
また、Signed-off-by
トレーラーには実名が使用されることに注意してください。実名を隠さないでください。
よろしければ、最後に以下の追加トレーラーを付けることができます。
-
Reported-by:
は、パッチが修正しようとするバグを発見した人にクレジットを与えるために使用されます。 -
Acked-by:
は、パッチが変更しようとする領域に詳しい人がそのパッチを気に入ったことを示します。 -
Reviewed-by:
は、他のトレーラーとは異なり、詳細な分析の後でパッチに完全に満足した場合にのみ、レビュアー自身が提供できます。 -
Tested-by:
は、その人がパッチを適用し、それが望ましい効果をもたらしたことを示すために使用されます。 -
Co-authored-by:
は、パッチを提出する前に人々がドラフトを交換したことを示すために使用されます。 -
Helped-by:
は、パッチ形式で正確な変更を提供することなく、変更のアイデアを提案した人にクレジットを与えるために使用されます。 -
Mentored-by:
は、メンターシッププログラム(例:GSoCまたはOutreachy)の一環としてパッチ開発を支援した人にクレジットを与えるために使用されます。 -
Suggested-by:
は、パッチのアイデアを提案した人にクレジットを与えるために使用されます。
状況に応じて独自のトレーラーを作成することもできますが、上記で強調したこのプロジェクトの一般的なトレーラーのいずれかを使用することをお勧めします。
トレーラーの最初の文字のみを大文字にしてください。つまり、「Signed-Off-By」ではなく「Signed-off-by」、「Acked-By」ではなく「Acked-by:」を好んでください。
コミットからGitツールを使ってパッチを生成してください。
Gitベースのdiffツールはunidiffを生成しますが、これが推奨される形式です。
パッチがファイル名の変更を伴う場合でも、git
diff
や git
format-patch
の -M
オプションを恐れる必要はありません。受信側で問題なく処理できます。
パッチにコメントアウトされたデバッグコードを追加したり、パッチが達成しようとしていることと関係のない余分なファイルを含めたりしないようにしてください。生成したパッチをレビューして、正確性を確認してください。送信する前に、「開始点を選択してください」セクションで選択した開始点にきれいに適用されることを確認してください。
注
|
あなたのパッチをレビューする側の視点から見ると、master ブランチがデフォルトで期待される開始点です。したがって、異なる開始点を選択した場合は、カバーレターでその選択を伝えてください。 |
パッチの送信。
レビュアーの選択
注
|
セキュリティに関連する可能性のあるパッチは、公開メーリングリストではなく、Git Security メーリングリスト[1] に非公開で提出すべきです。 |
「To:」をメーリングリストに設定し、「cc:」にあなたが触れる領域に関与している人々(contrib/contacts/
[2] の git-contacts
スクリプトが彼らを特定するのに役立ちます)をリストして、コメントやレビューを募り、パッチを送信してください。また、あなたのトピックを next
と seen
に試行的にマージしたとき、あなたの変更と競合する他の人々の作業に気づいたかもしれません。これらの人々は、あなたが触れている領域に精通している可能性が高いです。
send-email
を使用している場合、次のように git-contacts
の出力をフィードできます。
git send-email --cc-cmd='perl contrib/contacts/git-contacts' feature/*.patch
リストがパッチを適用するのが良いという合意に達したら、含めるために「To:」をメンテナー[3]に設定し、「cc:」をリスト[4]に設定して再送信してください。これは、メンテナーが議論に積極的に参加せず、信頼できる他の人にレビューを任せた場合に特に重要です。
パッチを助けてくれた人々にクレジットを与えるために、必要に応じて Acked-by:
、Reviewed-by:
、Tested-by:
のようなトレーラー行を追加し、そのような最終版をインクルージョンのために送信する際に彼らを「cc:」に含めることを忘れないでください。
format-patch
と send-email
可能であれば、format-patch
と send-email
の使い方を学んでください。これらのコマンドは、パッチ送信のワークフローに最適化されており、既存のメールクライアント(多くは「multipart/*」MIMEタイプメールに最適化されています)がパッチを使用不能にする多くの方法を回避します。
注
|
ここでは、format-patch と send-email を使用する手順を概説しますが、代わりにGitGitGadget を使用してパッチを送信することもできます(MyFirstContribution を参照)。 |
Gitメーリングリストの参加者は、あなたが提出する変更を読み、コメントできる必要があります。開発者が標準的な電子メールツールを使用してあなたの変更を「引用」し、コードの特定の箇所にコメントできることが重要です。このため、各パッチは個別のメッセージで「インライン」で提出する必要があります。
パッチシリーズのその後のすべてのバージョンやその他の関連パッチは、読者がシリーズのすべての部分を見つけやすくするために、それぞれの電子メールスレッドにグループ化する必要があります。そのため、それらを追加の「カバーレター」メッセージ(下記参照)、最初のパッチ、またはそれぞれの前のパッチへの返信として送信してください。パッチシリーズの更新バージョンを提出する方法に関するステップバイステップガイドはこちらです。
ログメッセージ(Signed-off-by
トレーラーの名前を含む)がASCIIで書けない場合、正しいエンコーディングでメッセージを送信するようにしてください。
警告
|
MUA のワードラップがパッチを破損させないように注意してください。パッチをコピー&ペーストしないでください。注意しないとタブが失われる可能性があります。 |
件名行に [PATCH] というプレフィックスを付けるのが一般的な慣習です。これにより、人々は他の電子メールの議論からパッチを簡単に区別できます。角括弧内に PATCH に加えて、パッチの性質を説明するマーカーを使用することも推奨されます。例えば、[RFC PATCH](RFC は「request for comments」の略)は、パッチが受け入れられる前にさらなる議論が必要であることを示すためによく使用されます。[PATCH v2]、[PATCH v3] などは、以前送信したものの更新を送信するときによく見られます。
git
format-patch
コマンドは、電子メールメッセージの本文をフォーマットするための現在の最善の慣行に従います。パッチの冒頭にはコミットメッセージがあり、Signed-off-by
トレーラーと、3つのダッシュで構成される行で終わり、その後に diffstat 情報とパッチ自体が続きます。他の人からパッチを転送している場合は、オプションで、コミットメッセージが始まる直前の電子メールメッセージの冒頭に、「From: 」行を置いてその人の名前を記述できます。件名のデフォルトの「[PATCH]」を「[<text>]」に変更するには、git
format-patch
--subject-prefix=
<text> を使用します。ショートカットとして、--subject-prefix="RFC
PATCH"
の代わりに --rfc
を、または --subject-prefix="PATCH
v
<n>"
の代わりに -v
<n> を使用できます。
多くの場合、コミットメッセージ自体とは別に、パッチに関する追加の説明を追加したいと思うでしょう。そのような「カバーレター」の内容は、3つのダッシュの行とdiffstatの間に配置します。複数回のレビューと議論が必要なパッチの場合、各イテレーション間の変更の説明はGit-notesに保持し、git
format-patch
--notes
を介して3つのダッシュの行の後に自動的に挿入できます。
これは実験的なものです.
トピックを送信する際、それが選択されたときに「What’s cooking」レポートに表示されるべき1段落の要約を提案できます。そうすることを選択した場合、リリースノートにうまく収まるような2〜5行の段落を記述し(Documentation/RelNotes/* ファイルの多くの箇条書きのエントリを参照)、それをカバーレターの最初の段落にしてください。単一パッチシリーズの場合、前述のとおり、3つのダッシュの行とdiffstatの間のスペースを使用してください。
パッチをMIME添付ファイルとして、圧縮の有無にかかわらず、添付しないでください。メールクライアントにquoted-printableを送信させないでください。メールクライアントにformat=flowedを送信させないでください。これはパッチ内の空白を破壊します。多くの人気のあるメールアプリケーションは、MIME添付ファイルをプレーンテキストとして常に送信するわけではないため、コードにコメントすることが不可能になります。MIME添付ファイルは処理に少し時間がかかります。これはMIME添付された変更が承認される可能性を低下させるものではありませんが、延期される可能性を高めます。
例外: あなたのメーラーがパッチを破損させている場合、誰かがMIMEを使って再送するように依頼するかもしれません。それは問題ありません。
パッチにPGP署名をしないでください。ほとんどの場合、メンテナーやリストの他の人々はあなたのPGPキーを持っていないでしょうし、とにかくそれを取得する手間をかけないでしょう。あなたのパッチはあなたが誰であるかによって判断されるわけではありません。不明なソースからの良いパッチは、既知の、尊敬されるソースからの不十分な、または間違ったことをするパッチよりも、受け入れられる可能性がはるかに高いです。
もし本当にPGP署名付きパッチを送信したいのであれば、-----BEGIN
PGP
SIGNED
MESSAGE-----
で始まるテキスト/プレーンメッセージではなく、「multipart/signed」としてフォーマットしてください。それはテキスト/プレーンではありません。別のものです。
競合の処理とパッチの反復
パッチへの変更を改訂する際、他の進行中のトピックとの競合の可能性を認識することが重要です。これらの潜在的な競合を効果的に乗り越えるには、以下に示す推奨手順に従ってください。
-
適切なベースブランチに基づいてビルドし、上記のセクションを参照し、シリーズをformat-patchします。前のラウンドから更新するために「rebase -i」をインプレースで行っている場合、これは以前のベースを再利用するため、(2)と(3)は些細なことになります。
-
最後のラウンドがキューに入っていたベースを見つける
$ mine='kn/ref-transaction-symref' $ git checkout "origin/seen^{/^Merge branch '$mine'}...master"
-
format-patch の結果を適用します。2つのケースがあります。
-
きれいに適用され、テストも問題ありません。(4)へ進みます。
-
きれいに適用されるがビルドできない、またはテストが失敗する、あるいはきれいに適用されない。
後者の場合、古いベースと(1)でビルドに使用したベースとの間の差分に起因するテキストまたは意味上の競合が発生しています。何が破損を引き起こしたのかを特定します(例:(2)で使用されたベースから(1)で使用されたベースまでの間に1つまたは2つのトピックがマージされた可能性があります)。
最新の origin/master (これは (2) で使われたベースよりも新しいかもしれません) をチェックアウトし、新たに依存するトピックを「merge --no-ff」でマージし、そのマージの結果をベースとして使い、シリーズをリビルドして再度テストします。そのマージからトピックの先端まで format-patch を実行します。もしあなたが以下を行った場合:
$ git checkout origin/master $ git merge --no-ff --into-name kn/ref-transaction-symref fo/obar $ git merge --no-ff --into-name kn/ref-transaction-symref ba/zqux ... rebuild the topic ...
そうすれば、これらの「地ならし」マージの上にトピックをフォーマットするだけです。例:
$ git format-patch "HEAD^{/^Merge branch 'ba/zqux'}"..HEAD
カバーレターに、これを行ったこと、および master の上にベースに含まれるトピックを含めて書き忘れないでください。そして (4) に進んでください。
-
-
あなたのトピックを next と seen に試行的にマージしてみましょう。例えば、
$ git checkout --detach 'origin/seen' $ git revert -m 1 <the merge of the previous iteration into seen> $ git merge kn/ref-transaction-symref
「revert」は、あなたのトピックの以前のイテレーションがすでに seen にある場合(このケースのように)に必要です。以前のイテレーションを除外しながら master..origin/seen をゼロから再構築することを選択できます。これは、メンテナー側の動作をより厳密にエミュレートするかもしれません。
この試行的なマージは競合する可能性があります。これは主に、*他の*トピックがあなたのトピックとどのような競合を持つかを確認するためのものです。言い換えれば、あなたのトピックが*master*で機能するようにするために、それに依存する必要はありません。あなたのトピックが他のトピックより先に*next*に到達した場合、競合を解決するのは他のトピックの所有者の仕事になるかもしれません。
カバーレターに、発見した競合についてメモしてください。必ずしも解決する必要はありませんが、関連する分野で他の人々が何をしているかを知る良い機会となるでしょう。
$ git checkout --detach 'origin/next' $ git merge kn/ref-transaction-symref
これは、あなたのトピックが、すでに進行中の他のトピックとどのような競合があるかを確認するためのものです。(3)-2が、更新されたmasterと、*next*から取得した依存トピックの上にベースを準備した場合、これは競合しないはずです。コンテキストが深刻でない限り(古いイテレーションで同じ試行マージを試して、同様に競合するかどうかで判断できる)、メンテナー側で処理されると予想されます(手に負えない場合は、パッチを受け取ったときにリベースを依頼します)。
専任メンテナーがいるサブシステム
システムの一部には、独自のレポジトリを持つ専任のメンテナーがいます。
-
git-gui/
は Johannes Sixt がメンテナーを務める git-gui プロジェクト由来https://github.com/j6t/git-gui
Contibutions should go via the git mailing list.
-
gitk-git/
は Johannes Sixt がメンテナーを務める gitk プロジェクト由来https://github.com/j6t/gitk
Contibutions should go via the git mailing list.
-
po/
はローカライズコーディネーターである Jiang Xin 氏由来https://github.com/git-l10n/git-po/
これらの部分へのパッチは、それぞれのツリーに基づいている必要があります。
-
Jean-Noël Avila が率いる「Git ドキュメント翻訳」プロジェクトは、私たちのドキュメントページを翻訳しています。彼らの作業成果物は、このプロジェクトとは別に、私たちのツリーの一部としてではなく、別途管理されています。
https://github.com/jnavila/git-manpages-l10n/
GitHub CI
GitHubアカウントがあれば、GitHub CIを使用してLinux、Mac、Windowsで変更をテストできます。最近のCI実行の例については、https://github.com/git/git/actions/workflows/main.yml を参照してください。
初期設定には以下の手順に従ってください。
-
https://github.com/git/git をGitHubアカウントにフォークしてください。フォーク方法の詳しい手順は、こちらで見つけることができます:https://help.github.com/articles/fork-a-repo/
初期設定後、GitHubのGitのフォークに新しい変更をプッシュするたびにCIが実行されます。すべてのブランチのテスト状態は、https://github.com/<Your GitHub handle>/git/actions/workflows/main.yml で監視できます。
ブランチがすべてのテストケースに合格しない場合、緑色のチェックマークではなく、赤色の x
でマークされます。その場合、失敗したジョブをクリックして、「ci/run-build-and-tests.sh」および/または「ci/print-test-failures.sh」に移動できます。また、デバッグに関連するテストデータを含むtar(またはzip)アーカイブが含まれたzipアーカイブである「Artifacts」をダウンロードすることもできます。
次に、問題を修正し、修正をGitHubフォークにプッシュします。これにより、すべてのテストがパスすることを確認するための新しいCIビルドがトリガーされます。
MUA固有のヒント
私がリストから受け取ったり取得したりするパッチの中には、共通の破損パターンを持つものがあります。MUAが空白を壊さないように適切に設定されていることを確認してください。
パッチを自分宛にメールで送信し、git-am[1] で適用してチェックするヒントについては、git-format-patch[1] の DISCUSSION セクションを参照してください。
その際、パッチ適用を試行した結果のコミットログメッセージを確認してください。結果のコミットにあるものが、あなたが望むものとまったく同じでなければ、メンテナーがあなたのパッチを適用する際にログメッセージを手動で編集することになる可能性が非常に高いです。「Hi, this is my first patch.\n」のようなものが、本当にパッチのメールに含めたいのであれば、コミットメッセージの終わりを示す3つのダッシュの行の後に入れるべきです。
Pine
(ヨハネス・シクスト)
I don't know how many people still use pine, but for those poor souls it may be good to mention that the quell-flowed-text is needed for recent versions. ... the "no-strip-whitespace-before-send" option, too. AFAIK it was introduced in 4.60.
(リーナス・トーバルズ)
And 4.58 needs at least this. diff-tree 8326dd8350be64ac7fc805f6563a1d61ad10d32c (from e886a61f76edf5410573e92e38ce22974f9c40f1) Author: Linus Torvalds <torvalds@g5.osdl.org> Date: Mon Aug 15 17:23:51 2005 -0700 Fix pine whitespace-corruption bug There's no excuse for unconditionally removing whitespace from the pico buffers on close. diff --git a/pico/pico.c b/pico/pico.c --- a/pico/pico.c +++ b/pico/pico.c @@ -219,7 +219,9 @@ PICO *pm; switch(pico_all_done){ /* prepare for/handle final events */ case COMP_EXIT : /* already confirmed */ packheader(); +#if 0 stripwhitespace(); +#endif c |= COMP_EXIT; break;
(ダニエル・バーカロウ)
> A patch to SubmittingPatches, MUA specific help section for > users of Pine 4.63 would be very much appreciated. Ah, it looks like a recent version changed the default behavior to do the right thing, and inverted the sense of the configuration option. (Either that or Gentoo did it.) So you need to set the "no-strip-whitespace-before-send" option, unless the option you have is "strip-whitespace-before-send", in which case you should avoid checking it.
Thunderbird, KMail, GMail
git-format-patch[1] の MUA-SPECIFIC HINTS セクションを参照してください。