Summary
これは、Gitツリーに変更を加え、レビューのために送信し、コメントに基づいて変更を加えるエンドツーエンドのワークフローを説明するチュートリアルです。
前提条件
このチュートリアルは、あなたがGitを使用してソースコードを管理することにすでにかなり精通していることを前提としています。 Gitワークフローの手順はほとんど説明していません。
Related Reading
このチュートリアルは、以下のドキュメントを要約することを目的としていますが、読めば有用な追加事項を見つけることができるでしょう:
-
Documentation/SubmittingPatches
-
Documentation/howto/new-command.txt
Getting Help
あなたが行き詰まった場合は、以下の場所で助けを求めることができます。
git@vger.kernel.org
これは、コードレビュー、バージョンアナウンス、デザインディスカッションなどが行われるメインのGitプロジェクトメーリングリストです。 貢献に興味のある方は、ここに質問を投稿してください。 Gitメーリングリストにはプレーンテキストのみの電子メールが必要であり、メールに返信するときはインライン投稿とボトム投稿を優先します。 あなたはあなたへのすべての返信でCCされます。 オプションで、本文に「subscribe git」を付けてmajordomo@vger.kernel.orgに電子メールを送信することにより、リストをサブスクライブできます。 このメーリングリストの archive はブラウザで表示できます。
git-mentoring@googlegroups.com
このメーリングリストは、新しい寄稿者を対象としており、メインリストの一般の人の目に触れないように質問を投稿したり回答を受け取ったりする場所として作成されました。 メンターの新参者を支援することに特に関心のあるベテランの貢献者がリストに含まれています。 検索インデクサーを回避するには、メッセージを表示するためにグループメンバーシップが必要です。 誰でも参加でき、承認は必要ありません。
#git-devel on Libera Chat
このIRCチャネルは、Gitコントリビューター間の会話用です。 誰かが現在オンラインで、あなたの質問に対する答えを知っている場合、あなたはリアルタイムで助けを受け取ることができます。 それ以外の場合は、 scrollback を読んで、誰かがあなたに回答したかどうかを確認できます。 IRCはオフラインのプライベートメッセージを許可していません。そのため、誰かにプライベートメッセージを送信してから、IRCからログアウトしようとすると、その人はあなたに応答できません。 切断した場合に回答できるように、また他の人が会話から学ぶことができるように、チャネルで質問することをお勧めします。
Getting Started
Clone the Git Repository
Gitは多くの場所でミラーリングされています。 それらの1つからリポジトリのクローンを作成します。 https://git-scm.com/downloads は、クローンを作成するのに最適な場所の1つがGitHubのミラーであることを示しています。
$ git clone https://github.com/git/git git
$ cd git
依存関係のインストール
ソースからGitをビルドするには、あなたはシステムにいくつかの依存関係をインストールする必要があります。 必要なもののヒントについては、外部プログラムとライブラリへのGitの依存関係に関するセクションに細心の注意を払って、 INSTALL
を見ることで分かります。 そのドキュメントには、インストールせずに新しく構築したGitを「テスト運転」(test-drive)する方法が記載されています。 これが、このチュートリアルで使用する方法です。
上記手順でGitの新しいクローンを作成して、環境に必要なものがすべて揃っていることを確認してください:
$ make
Note
|
Gitのビルドは並列化可能です。 -j# は上記に含まれていませんが、ここや他の場所で好きなように使用できます。 |
Identify Problem to Solve
このチュートリアルでは、「Pony Saying ‘Um, Hello’」の略である新しいコマンド git psuh
(訳注:pushでは無くてpsuh)を追加します。これは、ユーザーの通常の日常のワークフローで頻繁に呼び出されるにもかかわらず、実装されていない機能です。
(この分野では sl
のような人気コマンドの実装の他にも、いくつかの取り組みが見られます。)
Set Up Your Workspace
まず、変更に取り組むための開発ブランチを作成することから始めましょう。 Documentation/SubmittingPatches
によると、まったく新しいコマンドは新機能であるため、master
に基づいて作業するのは問題ありません。 ただし、将来のバグ修正などについては、そのドキュメントを確認し、適切なブランチに基づいて作成する必要があります。
このドキュメントでは、すべての作業を、アップストリームプロジェクトの master
ブランチを基にして行います。 以下のように、開発に使用する psuh
ブランチを作成します:
$ git checkout -b psuh origin/master
私達は複数のパッチを含むトピックを同時に、レビューのために送信する方法を示すために、ここでいくつかのコミットを行います。
Code It Up!
Note
|
リファレンス実装は https://github.com/nasamuffin/git/tree/psuh にあります。 |
Adding a New Command
沢山のサブコマンドが組み込みとして書かれています。つまり、C言語で実装され、メインの git
実行ファイルにコンパイルされているということです。非常にシンプルな psuh
コマンドを組み込みで実装することで、コードベースの構造や、内部 APIや、貢献者としてレビュー担当者やメンテナと共にこの変更をシステムに統合するプロセス、を見せることができます。
組み込みサブコマンドは通常、 サブコマンドにちなんで名付けられ、 cmd_
という名前の関数の後にサブコマンドの名前が続く、 builtin/
内に含まれるソースファイルに実装されます。 したがって、コマンドを builtin/psuh.c
に実装するのは理にかなっています。 そのファイルを作成し、その中に、スタイルとシグネチャに一致する関数であなたのコマンドのエントリポイントを記述します:
int cmd_psuh(int argc, const char **argv, const char *prefix)
また、私達は psuhの宣言を追加する必要があります。 builtin.h
を開き、宣言をアルファベット順に保つために、 cmd_pull
の宣言を見つけ、その直前に psuh
の行を追加します。
int cmd_psuh(int argc, const char **argv, const char *prefix);
そして、あなたの push.c
に必ず #include "builtin.h"
を書き込んでください。
早速、その関数に使い捨てのprintfを追加します。 ビルドルールを追加してコマンドを登録できるようになったので、これは適切な開始点です。
Note
|
あなたの使い捨てのテキスト、およびこのチュートリアルの過程で追加するテキストの多くは、ユーザー向けです。 つまり、ローカライズ可能である必要があります。 po/README.md の 「Marking strings for translation」をご覧ください。 チュートリアル全体を通して、必要に応じて翻訳用の文字列にマークを付けます。 将来、ユーザー向けのコマンドを作成するときにもそうする必要があります。 |
int cmd_psuh(int argc, const char **argv, const char *prefix)
{
printf(_("Pony saying hello goes here.\n"));
return 0;
}
ではビルドしてみましょう。 Makefile
を開き、 builtin /pull.o
が BUILTIN_OBJS
に追加されている場所を見つけ、次に、それと同一の方法でアルファベット順になるように builtin/psuh.o
を追加します。それができたら、最上位ディレクトリに移動し、 make
を使用してビルドします。 また、 DEVELOPER = 1
変数を追加して、いくつかの追加の警告をオンにします:
$ echo DEVELOPER=1 >config.mak
$ make
Note
|
あなたがGitプロジェクトを開発するときは、 DEVELOPER フラグを使用することをお勧めします。 何らかの理由で機能しない場合は、オフにすることができますが、その問題をメーリングリストに記載することをお勧めします。 |
素晴らしい! これで、あなたの新しいコマンドそれ自体は問題なくビルドされます。 しかし、まだ誰もそれを呼び出しません。次はそこをいじりましょう。
コマンドのリストは git.c
にあります。 commands[]
配列に cmd_struct
を追加することで、新しいコマンドを登録できます。 struct cmd_struct
は、コマンド名、コマンドの実装への関数ポインタ、およびセットアップオプションフラグを含む文字列を受け取ります。 今のところは push
を模倣し続けることしましょう。 cmd_push
が登録されている行を見つけてコピーし、 cmd_psuh
に変更して、新しい行をアルファベット順に(cmd_pull
の直前に)配置します。
オプションは、「Adding a new built-in. 」の「builtin.h」に記載されています。 後でユーザーの現在のワークスペースコンテキストに関するデータを出力したいので、Gitディレクトリが必要です。 そのため、あなたの唯一のオプションとして RUN_SETUP
を選択します。
早速、もう一度ビルドしてください。 きれいなビルドが表示されるはずなので、ざっと動かしてみて、それが機能するかどうかを確認しましょう。 bin-wrappers
ディレクトリにあなたがテストに使用できるバイナリがあります。
$ ./bin-wrappers/git psuh
見たまえ!あなたは今、コマンドをゲットしました!よくやった! では、これをコミットするとしましょう。
git status
は、変更された Makefile
と builtin.h
と` git.c` と 追跡されていない builtin/psuh.c
と git-psuh
を明らかにします。 まず、無視する必要のあるバイナリを処理しましょう。 エディターで .gitignore`を開き、 `/git-pull
を見つけて、新しいコマンドのエントリをアルファベット順に追加します:
...
/git-prune-packed
/git-psuh
/git-pull
/git-push
/git-quiltimport
/git-range-diff
...
git status
をもう一度チェックすると、 git-push
が追跡されていないリストから削除され、 .gitignore
が変更されたリストに追加されていることがわかります。 これで、私達はステージングしてコミットできます:
$ git add Makefile builtin.h builtin/psuh.c git.c .gitignore
$ git commit -s
あなたがコミットメッセージを書くためにエディターが表示されます。 作業中のコンポーネントの名前を含む50桁以下の件名でコミットを開始し、その後に空行1行(常に必須)、そして内容の大部分を提供するコミットメッセージの本文を続けます。 特に、diffから簡単に理解できない場合は、変更の「理由」を明示して提供することを忘れないでください。 コミットメッセージを編集する際に、上記 -s
によって追加された Signed-off-by
トレーラーを削除しないでください。
psuh: add a built-in by popular demand
Internal metrics indicate this is a command many users expect to be
present. So here's an implementation to help drive customer
satisfaction and engagement: a pony which doubtfully greets the user,
or, a Pony Saying "Um, Hello" (PSUH).
This commit message is intentionally formatted to 72 columns per line,
starts with a single line as "commit message subject" that is written as
if to command the codebase to do something (add this, teach a command
that). The body of the message is designed to add information about the
commit that is not readily deduced from reading the associated diff,
such as answering the question "why?".
JP)このコミットメッセージは意図的に一行72桁のフォーマットになっており、
"commit message subject" という一行で始まり、コードベースに何かを命令
するように書かれています(これを追加しろ、そのコマンドを教える、等)。
メッセージの本文は、関連する diff を読んだだけではわからないコミットに
関する情報、たとえば "なぜ?" という質問に答えるような情報を追加するよ
うに意図されています。
Signed-off-by: A U Thor <author@example.com>
早速、 git show
を使用して新しいコミットを調べます。 "psuh:" は、主に psuh
コマンドを変更したことを示します。 件名は、読者にあなたが何を変更したかについての考えを与えます。 サインオフライン(-s
)は、Developer’s Certificate of Origin 1.1(開発者の原産地証明書1.1)に同意することを示します(Documentation/SubmittingPatches
[[dco]] ヘッダー参照)。
チュートリアルの残りの部分では、簡潔にするために件名のみをリストします。 ただし、完全に肉付けされたコミットメッセージの例は、このドキュメントの上部にリンクされているリファレンス実装で入手できます。
Implementation
文字列を出力する以外に、少なくとも何かを行うと便利です。 まず、私たちが得たものすべてを見てみましょう。
あなたの cmd_psuh
実装を変更して、渡された引数をダンプし、既存の printf()
呼び出しはそのままにします:
int i;
...
printf(Q_("Your args (there is %d):\n",
"Your args (there are %d):\n",
argc),
argc);
for (i = 0; i < argc; i++)
printf("%d: %s\n", i, argv[i]);
printf(_("Your current working directory:\n<top-level>%s%s\n"),
prefix ? "/" : "", prefix ? prefix : "");
ビルドして試してみてください。 ご想像のとおり、私達のコマンドの名前を含め、私達がコマンドラインで与えたものはほとんど何でもあります。 (prefix
が空の場合は、 cd Documentation/ && ../bin-wrappers/git psuh
としてみてください)。 これあまり役に立ちません。 では、私達は他にどのようなコンテキストを取得できるでしょうか?
#include "config.h"
行を追加します。 そして関数本体にちょびっと追加します:
const char *cfg_name;
...
git_config(git_default_config, NULL);
if (git_config_get_string_tmp("user.name", &cfg_name) > 0)
printf(_("No name is found in config\n"));
else
printf(_("Your name: %s\n"), cfg_name);
git_config()
は、Gitに認識されている構成ファイルから構成を把握し、標準の優先順位ルールを適用します。 git_config_get_string_tmp()
は特定のキー("user.name")を検索し、値を提供します。 このような単一キー探索関数は多数あります。 それらすべて(および git_config()
の使用方法に関する詳細情報)は、 Documentation/technical/api-config.txt
で確認できます。
出力された名前が、実行時に表示される名前と一致することがわかります:
$ git config --get user.name
すばらしい! これで、Git構成の値を確認する方法がわかりました。 これもコミットしましょう。そうすれば、自身の成果を失うことはありません。
$ git add builtin/psuh.c
$ git commit -sm "psuh: show parameters & config opts"
Note
|
繰り返しになりますが、上記のように -m で済ますのはチュートリアルを簡潔にするためです。 実際の変更では、 -m を使用するのではなく、エディターを使用して意味のあるメッセージを記述してください。 |
さらに、ユーザーの作業コンテキストがどのようなものかを知っておくと便利です。 ユーザーの現在のブランチの名前を出力できるかどうかを見てみましょう。 git status
の実装を模倣できます。私達は、出力関数が wt-status.c
にあり、ブランチが struct wt_status
に保持されていることが分かりました。
wt_status_print()
は、 builtin/commit.c
の cmd_status()
によって呼び出されます。 その実装を見ると、ステータス構成が以下のように入力されていることがわかります:
status_init_config(&s, git_status_config);
しかし、ドリルダウンすると、 status_init_config()
が git_config()
の呼び出しをラップしていることがわかります。 前のコミットで私達が書いたコードを変更してみましょう。
struct wt_status
を使用できるように、必ず以下のヘッダーファイルを含めてください:
#include "wt-status.h"
次に、 あなたの cmd_psuh
実装を変更して、 あなたの struct wt_status
を宣言し、準備して、その内容を出力します:
struct wt_status status;
...
wt_status_prepare(the_repository, &status);
git_config(git_default_config, &status);
...
printf(_("Your current branch: %s\n"), status.branch);
もう一度実行して、確認します。 — これがあなたの現在のブランチの(冗長な)名前です!
これもコミットしましょう。
$ git add builtin/psuh.c
$ git commit -sm "psuh: print the current branch"
(コミットしたので)今や、その特定のコミットに関する情報を私達が取得できるかどうかを見てみましょう。
幸いなことに、ここでは、私達のためにいくつかのヘルパーがあります。 commit.h
には lookup_commit_reference_by_name
という関数があり、ハードコードされた文字列を簡単に設定できます。 pretty.h
には、完全な形式のオブジェクトを渡す必要のない非常に便利な pp_commit_easy()
呼び出しがあります。
以下のインクルードファイルを追加します:
#include "commit.h"
#include "pretty.h"
次に、 cmd_psuh()
の実装内で、宣言とロジックの近くにそれぞれ以下の行を追加します。
struct commit *c = NULL;
struct strbuf commitline = STRBUF_INIT;
...
c = lookup_commit_reference_by_name("origin/master");
if (c != NULL) {
pp_commit_easy(CMIT_FMT_ONELINE, c, &commitline);
printf(_("Current commit: %s\n"), commitline.buf);
}
struct strbuf
は、基本的な char *
にいくつかの安全機構(safety belts)を提供します。そのうちの1つは、バッファオーバーランを防ぐための長さのメンバーです。 これは STRBUF_INIT
でうまく初期化する必要があります。 char*
を渡す必要がある場合は、この点に注意してください。
lookup_commit_reference_by_name
は渡された名前を解決するので、その値で遊んでみて、どんなことを思いつくか見てみましょう。
pp_commit_easy
は、フォーマット構造体全体ではなく、単一のフォーマット列挙型の省略形をとる pretty.h
の便利なラッパーです。 そしてそれから、その省略形に従ってコミットをきれいに印刷(pretty-prints)します。 これらは、多くのGitコマンドで --pretty=FOO
で使用できる形式に似ています。
ビルドして実行すると、あなたが例で同一の名前を使用している場合は、あなたが知っている origin/master
に最新のコミットの件名が表示されます。ちゃんとできました! これもコミットしましょう。
$ git add builtin/psuh.c
$ git commit -sm "psuh: display the top of origin/master"
Adding Documentation
素晴らしい! あなたはコミュニティと共有する準備ができている素晴らしい新しいコマンドを持っています。 だがちょっと待って欲しい。 — これはあまりユーザーフレンドリーではありません。 以下を実行してみます:
$ ./bin-wrappers/git help psuh
あなたの新しいコマンドは文書化されていません! これを直しましょう。
Documentation/git-*.txt
を見てください。 これらは、Gitが知っているサブコマンドのマニュアルページです。 これらを開いてフォーマットを理解するために確認することもできますが、まずは新しいファイル Documentation/git-psuh.txt
を作成します。 Gitプロジェクトのほとんどのドキュメントと同様に、ヘルプページは AsciiDoc で作成されています(CodingGuidelinesの「Writing Documentation」セクションを参照)。 以下のテンプレートに従ってあなた独自のmanpageを作成します:
git-psuh(1)
===========
NAME
----
git-psuh - Delight users' typo with a shy horse
SYNOPSIS
--------
[verse]
'git-psuh [<arg>...]'
DESCRIPTION
-----------
...
OPTIONS[[OPTIONS]]
------------------
...
OUTPUT
------
...
GIT
---
Part of the linkgit:git[1] suite
注意すべき最も重要な部分は、 = で下線が引かれたファイルヘッダー、NAMEセクション、およびコマンドが引数を取る場合に通常は文法を含むSYNOPSISです。 ドキュメントが他のGitおよびUNIXのmanpageと一致するように、確立されたmanpageヘッダー(well-established manpage headers)を使用するようにしてください。 これにより、ユーザーは必要な情報が含まれていることがわかっているセクションにスキップできるため、ユーザーが楽をできます。
Note
|
ドキュメントを作成する前に、パッケージ asciidoc がインストールされていることを確認してください。 |
今や、あなたのmanpageを記述したので、明示的にそれをビルドする必要があります。 以下のようにしてAsciiDocを人間が読めるtroffに変換します:
$ make all doc
$ man Documentation/git-psuh.1
または
$ make -C Documentation/ git-psuh.1
$ man Documentation/git-psuh.1
これは git help
を実行するほど満足のいくものではありませんが、少なくともあなたのヘルプページが正しく表示されていることを確認できます。
トップレベルから make check-docs
を実行することで、ドキュメントの適用範囲が良好であることを確認することもできます(つまり、プロジェクトはあなたのコマンドが実装され、ドキュメント化されていることを確認します)。
早速、あなたの新しいドキュメントの変更をコミットします。
Adding Usage Text
./bin-wrappers/git psuh -h
を実行してみてください。 コマンドは最後にクラッシュするはずです。 なぜならこれは、 -h
が、あなたのコマンドが使用法の出力を処理しなければならない特殊なケースであるためです。
Documentation/technical/api-parse-options.txt
をご覧下さい。 これはあなたが扱えるようにする必要があるオプションを引っ張り出すめの便利なツールで、使用法の文字列を受け取ります。
これを使用するには、使用文字列のNULLで終了する配列と builtin_psuh_options
配列を準備する必要があります。
#include "parse-options.h"
行を追加します。
グローバルスコープで、あなたの使用法文字列の配列を追加します:
static const char * const psuh_usage[] = {
N_("git psuh [<arg>...]"),
NULL,
};
次に、あなたの cmd_psuh()
実装内で、 option
構造体を宣言して入力できます。 私たちのものはかなり退屈ですが、 parse_options()
をより詳細に調べたい場合は、さらに追加することができます:
struct option options[] = {
OPT_END()
};
最後に、あなたの引数とプレフィックスを出力する前に、 parse-options()
の呼び出しを追加します:
argc = parse_options(argc, argv, prefix, options, psuh_usage, 0);
この呼び出しにより、あなたの argv
パラメーターが変更されます。 argv
から options
で指定したオプションが削除され、 options
エントリからポイントされた場所が更新されます。 必ず あなたの argc
を parse_options()
の結果に置き換えてください。そうしないと、後で argv
をパースしようとしたときに混乱します。
特別な引数 --
に注意する価値があります。 ご存知かもしれませんが、多くのUnixコマンドは「名前付きパラメータの終わり」を示すために --
を使用します — --
の後のすべてのパラメータは単に位置引数として解釈されます。 (これは、通常はフラグとして解釈されるものをパラメーターとして渡したい場合に便利です。) parse_options()
は --
に達するとパースを終了し、その後、残りのオプションをそのまま提供します。
今や、あなたは使用上のヒントが得られたので、 command-list.txt
から生成される git help git
または git help -a
で示される一般的なコマンドリストにそれを表示する方法をGitに教えることができます。 あなたは git-pull
の行を見つけて、その上に あなたの git-psuh
行をアルファベット順に追加できるようにします。これで、前述のヘルプコマンドのどこに表示されるかに影響を与える、コマンドに関するいくつかの属性を追加できます。 command-list.txt
の上部は、各属性の意味に関する情報を共有しています。これらのヘルプページでは、コマンドはこれらの属性に従ってソートされています。 git psuh
はユーザー向け、つまり磁器コマンドです。そのため、「mainporcelain」としてマークします。 「mainporcelain」コマンドの場合、 command-list.txt
の上部にあるコメントは、オプションで別のリストから属性を追加することもできることを示しています。 git psuh
はユーザーのワークスペースに関する情報を表示しますが、何も変更しないので、「info」としてマークしましょう。属性を他の command-list.txt
と同一のスタイルに保ち、適宜空白を使用してそれらを整列して記述します:
git-prune-packed plumbingmanipulators
git-psuh mainporcelain info
git-pull mainporcelain remote
git-push mainporcelain remote
再びビルドします。 これで、 -h
を指定して実行すると、他に何か面白いことが起こる前に、使用法が出力され、コマンドが終了するはずです。 すばらしい!
それでは、これもコミットしておいてください。
Testing
あなたのコードをテストすることは重要です — このような小さなおもちゃのようなコマンドであっても。 さらに、あなたのパッチはテストなしではGitツリーに受け入れられません。 テストは以下のようにする必要があります:
-
機能の現在の振る舞いを説明する
-
現在の振る舞いが期待される振る舞いと一致することを証明する
-
変更後に外部から見える動作が壊れていないことを確認します
それでは、いくつかのテストを書いてみましょう。
関連資料: t/README
Overview of Testing Structure
Gitのテストは t/
にあり、 t/README
の NamingTestsセクションに示されているスキーマを使用して4桁の10進数で名前が付けられます。
Writing Your Test
今回はおもちゃコマンドなので、思い切ってテストにt9999という名前を付けましょう。 ただし、ファミリとサブコマンドの組み合わせの多くはいっぱいいっぱいであるため、ベストプラクティスは、追加したコマンドに十分近いコマンドを見つけて、その名前付け空間を共有することです。
新しいファイル t/t9999-psuh-tutorial.sh
を作成します。 ヘッダーは以下のように始めます(t/README
の「WritingTests」および「Source test-lib.sh」参照):
#!/bin/sh
test_description='git-psuh test
This test runs git-psuh and makes sure it does not crash.'
. ./test-lib.sh
TAP形式の結果を出力するために、テストは test_expect_success
内にフレーム化されます。 git psuh
がうまく終了せず、どこかで適切な動物について言及していることを確認しましょう:
test_expect_success 'runs correctly with no args and good output' '
git psuh >actual &&
grep Pony actual
'
あなたのスクリプトの下部に以下を追加して、あなたが必要なすべてを実行したことを示します:
test_done
あなたのテストスクリプトを実行可能としてマークしてください:
$ chmod +x t/t9999-psuh-tutorial.sh
make -C t test-lint
を実行すると、新しいテストスクリプトが正常に作成されたかどうかがわかります。これにより、テスト番号の一意性や実行可能ビットなどがチェックされます。
Running Locally
ローカルで実行してみましょう:
$ make
$ cd t/ && prove t9999-psuh-tutorial.sh
あなたは完全なテストスイートを実行して、 git-push
が何も壊さなかったことを確認できます:
$ cd t/
$ prove -j$(nproc) --shuffle t[0-9]*.sh
Note
|
これは、 make test を使用して行うことも、TAPを話すことができる任意のテストハーネスを使用することもできます。 prove は同時に実行できます。 shuffle`は、テストが実行される順序をランダム化します。これにより、テスト間の不要な依存関係に対する回復力が高まります。 `prove は出力をより良くする事もします。 |
では、この変更もコミットしておいてください。
共有の準備: パッチシリーズの解剖分析
あなたは、 Gitプロジェクトは電子メールで送信されたパッチを介してコード・レビューが行われ、準備が整いコミュニティによって承認されると、メンテナーによって適用されることに、既に気づかれていると思います。 Git プロジェクトはプル・リクエストからの貢献を受け入れません。また、レビューのために電子メールで送信されるパッチは、指定の方法でフォーマットする必要があります。
コミットを電子メールで送信されるパッチに変換する方法を検討する前に、最終結果である「パッチ・シリーズ」がどのようになるかを分析してみましょう。 例 は、 Git mailing list archive のWebインターフェース上のパッチ・シリーズの概要ビューです:
2022-02-18 18:40 [PATCH 0/3] libify reflog John Cai via GitGitGadget
2022-02-18 18:40 ` [PATCH 1/3] reflog: libify delete reflog function and helpers John Cai via GitGitGadget
2022-02-18 19:10 ` Ævar Arnfjörð Bjarmason [this message]
2022-02-18 19:39 ` Taylor Blau
2022-02-18 19:48 ` Ævar Arnfjörð Bjarmason
2022-02-18 19:35 ` Taylor Blau
2022-02-21 1:43 ` John Cai
2022-02-21 1:50 ` Taylor Blau
2022-02-23 19:50 ` John Cai
2022-02-18 20:00 ` // other replies elided
2022-02-18 18:40 ` [PATCH 2/3] reflog: call reflog_delete from reflog.c John Cai via GitGitGadget
2022-02-18 19:15 ` Ævar Arnfjörð Bjarmason
2022-02-18 20:26 ` Junio C Hamano
2022-02-18 18:40 ` [PATCH 3/3] stash: call reflog_delete from reflog.c John Cai via GitGitGadget
2022-02-18 19:20 ` Ævar Arnfjörð Bjarmason
2022-02-19 0:21 ` Taylor Blau
2022-02-22 2:36 ` John Cai
2022-02-22 10:51 ` Ævar Arnfjörð Bjarmason
2022-02-18 19:29 ` [PATCH 0/3] libify reflog Ævar Arnfjörð Bjarmason
2022-02-22 18:30 ` [PATCH v2 0/3] libify reflog John Cai via GitGitGadget
2022-02-22 18:30 ` [PATCH v2 1/3] stash: add test to ensure reflog --rewrite --updatref behavior John Cai via GitGitGadget
2022-02-23 8:54 ` Ævar Arnfjörð Bjarmason
2022-02-23 21:27 ` Junio C Hamano
// continued
以下の幾つかの点に留意してください:
-
各コミットは、 n コミット シリーズの i 番目のコミットを表す
[PATCH _i_/_n_]
という接頭辞が付けられたコミット・メッセージのタイトルを件名として、個別の電子メールとして送信されます。 -
各パッチは、
[PATCH 0/_n_]
という接頭辞が付いた、シリーズの、 カバー・レターと呼ばれる紹介メールへの返信として送信されます。 -
パッチ・シリーズの後続の反復は、「PATCH」の代わりに「PATCH v2」、「PATCH v3」などのラベルが付けられます。 たとえば、「[PATCH v2 1/3]」は、2 回目の繰り返しの 3 つのパッチの最初のパッチになります。 各反復は新しいカバー・レター (「[PATCH v2 0/3]」など) と共に送信され、それ自体が前の反復のカバー・レターへの返信です(詳細下記)。
Note
|
シングル・パッチ・トピックは、i/n 番号なしで「[PATCH]」、「[PATCH v2]」などで送信されます (ただし、上記の「スレッド概要」では、シングル・パッチ・トピックは表示されません)。 |
The cover letter
パッチごとの電子メールに加えて、Git コミュニティは、パッチにカバー・レターが付属していることも期待しています。 これは変更提出(change submission)の重要な要素であり、パッチを見るだけではなく、何をしようとしているのか、その理由をコミュニティに高レベルで説明するものです。
カバー・レターのタイトルは、トピック・ブランチ全体の目的を簡潔に網羅するものにする必要があります。 コミット・メッセージのタイトルと同じように、しばしば命令調になっています。 シリーズにタイトルを付ける方法は以下のとおりです:
--- Add the psuh command ---
カバー・レターの本文は、レビュー担当者に追加のコンテキストを提供するために使用されます。 パッチだけでは明らかにならないことは必ず説明してください。 ただし、カバー・レターはコミット履歴に記録されないため、将来リポジトリの履歴を読む人にとって役立つ可能性があるものはコミット・メッセージにも記載する必要があることを忘れないでください。
ここで、 push
の本文の例を以下に示します:
Our internal metrics indicate widespread interest in the command
git-psuh - that is, many users are trying to use it, but finding it is
unavailable, using some unknown workaround instead.
The following handful of patches add the psuh command and implement some
handy features on top of it.
This patchset is part of the MyFirstContribution tutorial and should not
be merged.
ここから、 パッチ・セットをフォーマットしてレビューを受けるための 2 つの異なる方法を示すために、チュートリアルは分岐します。
一番目の方法はGitGitGadgetです。これは、GitHubの一般的なプルリクエストワークフローに既に精通しているユーザーに役立ちます。 この方法ではGitHubアカウントが必要です。
2番目の方法は git send-email
にて対応します。これにより、送信する電子メールを少し細かく制御できます。 この方法には、システムに応じて変更される可能性のあるいくつかの設定が必要であり、このチュートリアルでは説明しません。
どちらの方法を選択しても、レビュー担当者との関わりは同じです。 レビュープロセスについては、GitGitGadget と git send-email
のセクションの後で説明します。
Sending Patches via GitGitGadget
パッチを送信するためのオプションの一つは、一般的なプルリクエストワークフローに従い、GitGitGadgetを介してパッチを送信することです。 GitGitGadgetは、GitHub PRワークフローに慣れている人にとって、Git寄稿者としての生活を容易にするために Johannes Schindelin によって作成されたツールです。 これにより、寄稿者はGitプロジェクトのミラーに対してプルリクエストを開くことができ、PRを一連の電子メールに変換して送信するための魔法を実行します。 また、Git継続的インテグレーションスイートも実行します。 これは http://gitgitgadget.github.io で文書化されています。
Forking git/git
on GitHub
あなたはGitGitGadgetを使用してレビューするためにパッチを送信する前に、Gitプロジェクトをフォークして変更をアップロードする必要があります。 まず最初に、GitHubアカウントを持っていることを確認してください。
GitHub mirror に移動し、フォークボタン(Fork button)を探します。 あなたの適切と思われる場所にあなたのフォークを配置作成します。
Uploading to Your Own Fork
ブランチを自分のフォークにアップロードするには、新しいフォークをリモートとして追加する必要があります。 git remote -v
を使用して、すでに追加したリモートを表示できます。 GitHubの新しいフォークのページから、「Clone or download」(クローンまたはダウンロード)を押してURLを取得できます。 次に、以下を実行してリモートを追加し、提供されている例の独自のURLとリモート名を置き換える必要があります:
$ git remote add remotename git@github.com:remotename/git.git
または、HTTPS URL を使って:
$ git remote add remotename https://github.com/remotename/git/.git
もう一度 git remote -v
を実行すると、新しいリモートが表示されます。 プッシュの準備をするために、 git fetch remotename
(remotenameの部分はあなたの実際のリモートの名前に置き換えて下さい) とします。
次に、 git branch
を実行して、あなたの全ての開発を新しいブランチで行っていることを再確認します。 そうでない場合は、今が新しいコミットを独自のブランチに移動する良い機会です。
このドキュメントの冒頭で簡単に説明したように、作業は master
に基づいているため、以下に示すように更新しておくか、好みのワークフローを使用してください。
$ git checkout master
$ git pull -r
$ git rebase master psuh
そして今や、あなたは新しいトピックブランチをプッシュする準備が整いました! (ブランチ名をあなたの実際のに置き換えるのと、あなたのコマンド名がpushじゃなくてpsuhであることに注意して下さい。)
$ git push remotename psuh
これで、あなたはGitHubで新しく作成したブランチにアクセスして確認できるようになります。
Sending a PR to GitGitGadget
コードをテストしてレビュー用にフォーマットするには、まず、 gitgitgadget/git
に対してプルリクエストを開く必要があります。 https://github.com/gitgitgadget/git にアクセスし、「New pull request」(新しいプルリクエスト)ボタンまたは、新しくプッシュしたブランチの名前とともに表示される便利な「Compare & pull request」(比較してプルリクエスト)ボタンを使用してPRを開きます。
PR のタイトルと説明を確認してください。 GitGitGadget では、あなたの変更の、カバー・レターの件名と本文としてそれぞれ使用されます。 提出物にタイトルを付ける方法と説明に含める内容については、上記 "The cover letter" を参照してください。
Note
|
単一パッチでの貢献の場合、あなたのコミット・メッセージはすでに意味のある内容があり、それはパッチの目的 (何が起こっているのか、その理由) を高レベルで説明しているべきであるため、通常は追加のコンテキストは必要ありません。 その場合、 GitHub がコミット・メッセージから自動的に生成する PR の説明を削除します (PR の説明は空にする必要があります)。 さらに多くのコンテキストを提供する必要がある場合は、その場所で行うことができ、GitGitGadget が送信する電子メールの三点鎖線(three-dash)と diffstat の間に追加されます (送信後の様子については Bonus Chapter: One-Patch Changes を参照してください)。 |
満足したら、プル・リクエストを送信します。
Running CI and Getting Ready to Send
あなたがGitGitGadgetを初めて使用する場合(このチュートリアルを使用している可能性が高い)、誰かがツールの使用許可を与える必要があります。 GitGitGadgetのドキュメントに記載されているように、PRに /allow<username>
を付けてコメントするにはすでにそれを使用している人が必要です。 GitGitGadgetは、許可が与えられていなくてもCIを介してPRを自動的に実行しますが、誰かがあなたにツールの使用を許可するまで、あなたの変更を /submit
することはできません。
Note
|
通常、GitGitGadgetであなたを /allow できる人を見つけるには、誰かに /allow が付与されている最近のプルリクエストを調べます(Search: is:pr is:open "/allow")。この場合、作成者と /allow を付与した人の両方が /allow できるようになります。 /allow するか、またはLiberaChatの #git-devel IRCチャネルで、プルリクエストをリンクして誰かに /allow するように依頼してください。 |
CIに失敗した場合は、 git rebase -i
を使用して変更を更新し、ブランチを再度プッシュできます:
$ git push -f remotename psuh
実際、パッチが next
に受け入れられるまで、この方法で変更を続ける必要があります。
Sending Your Patches
あなたのCIを通過し、誰かが /allow
コマンドでGitGitGadgetを使用する許可を与えたのなら、レビューのために送信するのは、/submit
でPRにコメントするのと同じくらい簡単です。
Updating With Comments
メーリングリストで受け取るレビューコメントに返信する方法については、 Responding to Reviews に進んでください。
すべてのレビューコメントに従って希望の形でブランチを作成したら、もう一度送信できます:
$ git push -f remotename psuh
次に、GitGitGadgetに対するプルリクエストを確認します。 CIが再び開始されたことがわかります。 CIの実行中に、プルリクエストスレッドの上部にある説明を変更するのに適したタイミングです。 カバーレターとして再び使用されます。 この場所を使用して、以前のバージョンから何が変更されたかを説明し、レビュー担当者が何を見ているのかをある程度把握できるようにする必要があります。 CIの実行が完了したら、 /submit
でもう一度コメントできます。GitGitGadgetはあなたの変更にv2マークを自動的に追加します。
Sending Patches with git send-email
GitGitGadgetを使用したくない場合は、Git自体を使用してパッチをメールで送信することもできます。 このようにGitを使用する利点には、件名をよりきめ細かく制御できること(たとえば、件名に [RFC PATCH]のタグを使用できること)や、メーリングリストに投稿する前に自分用の「ドライラン」メールを送ってすべてがうまくいくことを確認できることがあります。
Prerequisite: Setting Up git send-email
send-email` の設定はオペレーティングシステムやメールプロバイダーによって異なるので、このチュートリアルでは説明しません。 多くのLinuxディストリビューションでは、 git-send-email
は通常の git
インストールと一緒にパッケージされていません。 追加パッケージをインストールする必要があるかもしれません。 オンラインには、そのためのリソースがたくさんあります。 また、SMTPサーバーを使用するための正しい設定方法を決定する必要があります。 この設定はシステムやメールの設定によって大きく変わる可能性があるので、このチュートリアルの範囲外です。
Preparing Initial Patchset
Gitを使用したメールの送信は2つの部分からなるプロセスです。 メール自体を準備する前に、パッチを準備する必要があります。 幸いなことに、これは非常に簡単です:
$ git format-patch --cover-letter -o psuh/ --base=auto psuh@{u}..psuh
-
--cover-letter
オプションは、format-patch
にカバーレターのテンプレート・ファイルを作成するように指示します。 あなたは送信前にテンプレートに記入する必要があります。 しかし、今のところ、そのテンプレート・ファイルは他のパッチ・ファイルと一緒にあります。 -
-o psuh /
オプションは、パッチファイルをディレクトリに配置するようにformat-patch
に指示します。git send-email
はディレクトリを取得し、そこからすべてのパッチを送信できるため、これは便利です。 -
--base=auto
オプションは、受信者が一連のパッチを適用すると予想されるベース・コミットを記録するようにコマンドに指示します。auto
値の指定により、format-patch
はベース・コミットを自動的に計算します。これは、リモート追跡ブランチの先端コミットのマージ・ベースと指定されたリビジョン範囲です。 -
psuh@{u}..psuh
オプションはformat-patch
に、上流(「Set up your workspace」セクションの例に従った場合、これはorigin/master
です)から分岐したのでpsuh
ブランチ(訳注: push ではなくて psuh)で作成したコミット用のパッチを生成するように指示します。 既にpsuh
ブランチにいる場合は、 単に@{u}
と言うことができます。これは、「上流から分岐したため、現在のブランチでコミットする」ことを意味し、同じことを意味します。
このコマンドは、コミットごとに 1 つのパッチ・ファイルを作成します。 実行した後、お気に入りのテキスト・エディタで各パッチを調べて、すべてが適切に表示されることを確認できます。 ただし、パッチ・ファイルを使用してコードを修正することはお勧めしません。 パッチを変更するよりも、git rebase -i
を使用するか、新しいコミットを追加することによって、通常の方法で変更を加える方が良い考えです。
Note
|
オプションで、 --rfc フラグを使用して、パッチの件名の前に 「[PATCH]」ではなく「[RFCPATCH]」を付けることもできます。 RFCは「request for comments」の略で、コードを送信する準備が整っていないときに、コードレビュープロセスを開始することを示しています。 これは、パッチが提案である場合にも使用できますが、コミュニティがそのアプローチで問題を解決したいかどうか、つまり一種の設計レビューを実施したいかどうかはわかりません。 「WIP」とマークされたパッチもリストに表示される場合があります。これは、パッチが不完全であることを意味しますが、レビュー担当者にこれまでのパッチを確認してもらいたいことを意味します。 このフラグは --subject-prefix=WIP で追加できます。 |
パッチとカバーレターのテンプレートが指定したディレクトリに存在することを確認してください。これであなたがレビューを送信する準備がほぼ整いました!
Preparing Email
--cover-letter
を指定して format-patch
を呼び出したので、カバー・レターのテンプレートは既に用意されています。 それをお気に入りのエディターで開きます。
あなたは既に多数のヘッダーを拝んでいるはずです。 From:
ヘッダーが正しいことを確認してください。 その次に、Subject:
を変更します(パッチシリーズに適切なタイトルを選ぶには、 上記 を参照してください):
Subject: [PATCH 0/7] Add the 'psuh' command
必ず ”[PATCH 0/X]” の部分を保持してください。 これが、このメールがパッチ・シリーズの始まりであることをGitコミュニティに示しており、多くのレビュー担当者がこのタイプのフラグでメールをフィルタリングしています。
あなたはカバーレターを追加するために git send-email
を呼び出すときに、いくつかの追加パラメーターを追加する必要があります。
次に、カバーレターの本文を記入する必要があります。 繰り返しますが、含める内容については above を参照してください。
git format-patch --cover-letter
によって作成されたテンプレートには、diffstatが含まれています。 これにより、レビュー担当者は、トピックをレビューするときに何をしているのかを要約できます。 サンプル実装から psuh
用に生成されたものは以下のようになります:
Documentation/git-psuh.txt | 40 +++++++++++++++++++++
Makefile | 1 +
builtin.h | 1 +
builtin/psuh.c | 73 ++++++++++++++++++++++++++++++++++++++
git.c | 1 +
t/t9999-psuh-tutorial.sh | 12 +++++++
6 files changed, 128 insertions(+)
create mode 100644 Documentation/git-psuh.txt
create mode 100644 builtin/psuh.c
create mode 100755 t/t9999-psuh-tutorial.sh
最後に、この手紙文にはパッチの生成に使用されたGitのバージョンが含まれます。 この文字列は放っておいても大丈夫です。
Sending Email
この時点で、パッチとカバーレターが入ったディレクトリ psuh/
が作成されているはずです。 あなたがそれを送信する時が来ました! あなたは以下のように送信できます:
$ git send-email --to=target@example.com psuh/*.patch
Note
|
返信先アドレスの変更やCCおよびBCC行の追加など、役立つと思われるその他のオプションについては、 git help send-email を確認してください。 |
Note
|
実際のパッチを送信する場合、 git@vger.kernel.org に送信されますが、チュートリアルから実際のメーリングリストにパッチセットを送信しないでください。 今のところ、それがどのように見えるかを確実に理解するために、それを自分自身に送信することができます。 |
あなたが上記のコマンドを実行すると、各パッチが送信されるたびにインタラクティブなプロンプトが表示されます。 これにより、何かを編集したり送信をやめたりする最後のチャンスが得られます(ただし、繰り返しになりますが、この方法でコードを編集してはいけません)。 これらのプロンプトで y
または a
を押すと、メールが送信されます! おめでとうございます!
素晴らしい!これでコミュニティはすべてを捨ててあなたの変更をレビューすることでしょう。 (冗談です、我慢が肝要です)
Sending v2
このセクションでは、あなたのパッチセットの v2 を送信する方法に焦点を当てます。 v2 に何を含める必要があるかについては、 Responding to Reviews にスキップして、レビュー担当者からのコメントの処理方法を確認してください。
v2 の「psuh」トピック ブランチを再利用します。 変更を加える前に、簡単に参照できるように v1 ブランチの先端をマークします:
$ git checkout psuh
$ git branch psuh-v1
レビュアーのコメントに基づいてコミットを調整するには、 git rebase -i
を使用してパッチ・シリーズを改良します。 パッチ・シリーズを送信する準備ができたら、パッチを再度生成しますが、いくつかの新しいフラグを使用します:
$ git format-patch -v2 --cover-letter -o psuh/ --range-diff master..psuh-v1 master..
--range-diff master..psuh-v1
パラメータは、カバー・レターに psuh-v1
と psuh
の間の範囲差分(range-diff)を含めるように format-patch
に指示します (git-range-diff(1) 参照)。 これは、v1 パッチと v2 パッチの違いをレビュアーに伝えるのに役立ちます。
-v2
パラメータは、パッチをバージョン「2」として出力するように format-patch
に指示します。 たとえば、v2 パッチはすべて v2-000n-my-commit-subject.patch
のような名前になっていることに気付くかもしれません。 -v2
は、[PATCH]
の代わりに [PATCH v2]
をプレフィックスとしてパッチをフォーマットし、 range-diff は Range-diff against v1
で始まります。
このコマンドを実行すると、 format-patch
は v1 パッチと一緒に psuh/
ディレクトリにパッチを出力します。 単一のディレクトリを使用すると、v2 パッチを校正しながら古い v1 パッチを簡単に参照できますが、v2 パッチのみを送信するように注意する必要があります。 psuh/v2-*.patch
のようなパターンを使用します (v1 および v2 パッチに一致する psuh/*.patch
ではありません)。
カバーレターをもう一度編集します。 何か重要なことがあれば、今が前回のバージョンと現在のバージョンの違いについて言及する良い機会です。 2番目のカバーレターにまったく同じ本文は必要ありません。 レビューアの目に見えない可能性のある変更を説明することに焦点を当てます。
また、あなたはカバーレターのメッセージ ID を見つけなければなりません。 最初のシリーズを送信するときに git send-email
の出力をメモしておくができますし、 mailing list で調べることもできます。アーカイブでカバーレターを見つてクリックし、 そして "permalink" または "raw" をクリックすると、 以下のような Message-ID ヘッダーが表示されます:
Message-ID: <foo.12345.author@example.com>
あなたのメッセージIDは <foo.12345.author@example.com>
です。 この文章では以降、この例を使います。 previous cover letter を正しいメッセージIDに置き換えてください。つまり、v2を送信する場合は、v1からのMessage-IDを使用します。 v3を送信する場合は、v2からのMessage-Idを使用します。
メーリングリストではすべてのCCをスレッドに保持するのが一般的であるため、電子メールを見ている間、誰がCCされているかにも注意する必要があります。 これらのCC行は、ヘッダー(件名行の前)に以下のような行を使用して、カバーレターに直接追加できます:
CC: author@example.com, Othe R <other@example.com>
コマンドに渡すメッセージに細心の注意を払いながら、もう一度メールを送信します:
$ git send-email --to=target@example.com
--in-reply-to="<foo.12345.author@example.com>"
psuh/v2-*.patch
Bonus Chapter: One-Patch Changes
場合によっては、あなたのごくわずかな変更が1つのパッチのみで構成されていることがあります。 その場合、送信する必要があるのは1通のメールだけです。 コミットメッセージはすでに意味があり、パッチの目的(何が起こっているのか、その理由)を高レベルで説明しているはずですが、さらに多くのコンテキストを提供する必要がある場合は、パッチの ---
の下で行うことができます。 以下の例を見てください。これは、1回のコミットで git format-patch
を使用して生成され、編集されて、 ---
とdiffstatの間にコンテンツが追加されています。
From 1345bbb3f7ac74abde040c12e737204689a72723 Mon Sep 17 00:00:00 2001
From: A U Thor <author@example.com>
Date: Thu, 18 Apr 2019 15:11:02 -0700
Subject: [PATCH] README: change the grammar
I think it looks better this way. This part of the commit message will
end up in the commit-log.
Signed-off-by: A U Thor <author@example.com>
---
Let's have a wild discussion about grammar on the mailing list. This part of my email will never end up in the commit log. Here is where I can add additional context to the mailing list about my intent, outside of the context of the commit log. This section was added after `git format-patch` was run, by editing the patch file in a text editor.
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 88f126184c..38da593a60 100644
--- a/README.md
+++ b/README.md
@@ -3,7 +3,7 @@
Git - fast, scalable, distributed revision control system
=========================================================
-Git is a fast, scalable, distributed revision control system with an
+Git is a fast, scalable, and distributed revision control system with an
unusually rich command set that provides both high-level operations
and full access to internals.
--
2.21.0.392.gf8f6787159e-goog
My Patch Got Emailed - Now What?
Responding to Reviews
うまくいけば、数日後にはあなたのパッチセットへのコメント付きの返信が届くことでしょう。 やったね! まぁともあれ、これであなたは本来の作業に戻ることができます。
それぞれのコメントには、提案された変更を行ったこと、オリジナルの方が良いと思ったこと、あるいはコメントによって新しい方法を思いついたこと(オリジナルと提案された変更の両方が優れている) をレビュアーに知らせるのが良いマナーです。こうすることで、査読者は、あなたがコメントした事を実装したかどうかを判断するために、あなたのV2を検査する必要がなくなります。
査読者は、提案されたコミットログメッセージまたは変更自体のいずれかで、パッチセットに何を書き込んだかについて質問する場合があります。 応答メッセージでこれらの質問に答える必要がありますが、多くの場合、レビュー担当者が、あなたが何を書くつもりかを理解するためにこれらの質問をした理由は、パッチセットを理解するために説明が必要だったためです。
レビュアーの質問に答えて、レビュアーが「言いたいことがわかった」と言うだけで、満足してはいけないのです。 レビュアーが困っている点を明確にするためにパッチを更新し、v2を準備します。v1でレビュアーからの質問に答えるために使った言葉が、役に立つかもしれません。 あなたの目標は、v2を十分に明確にして、次に読む人に同じ説明をする必要がなくなるようにすることです。
コメントに対して反論する場合は、礼儀正しく、なぜあなたのオリジナルの方が良いと思うのかを説明します。レビュアーがまだあなたに同意しないかもしれないことや、コミュニティの他のメンバーが双方の側に意見するかもしれないことを覚悟してください。他のレビュアーは、あなたとは異なる視点でプロジェクトを見ており、あなたには思いもよらなかったような副作用について考えているかもしれません。なぜその変更が提案されたのか、あるいは査読者があなたに何を求めているのかがわからない場合は、いつでも説明を求めてかまいません。
あなたの電子メールクライアントにプレーンテキストの電子メールモードがあり、オンになっていることを確認してください。 GitメーリングリストはHTMLメールを拒否します。 Maintainer’s Note で概説されているメーリングリストのエチケットにも従ってください。 これは、ボトムポストやインラインリプライに関するほとんどのオープンソースコミュニティのエチケットルールに似ています。
コードに変更を加える場合、 git rebase -i
(対話的リベース)を使用すると、最もクリーンになります。つまり、結果のコミットが最も見やすくなります。 O’Reillyの overview ご覧ください。 一般的な考え方は、変更が必要な各コミットを変更することです。 このようにすると、v1では間違いのあるパッチAと、問題なく上流のレビューも必要ないパッチBと、v2ではパッチAを修正したパッチC、を用意する代わりに、正しいパッチAと正しいパッチBでv2を出荷すればいいのです。これは履歴を変更していますが、誰とも共有していないローカル履歴なので、今のところは問題ありません。 (後でこれを行うのは意味がない場合があります。コンテキストについては、次のセクションを参照してください。)
After Review Approval
Gitプロジェクトには、 seen
と next
と master
と maint
の4つの統合ブランチがあります。 変更は、レビュープロセスの途中で、メンテナによってかなり早い段階で「seen」(表示)されます。 そこから、より広範なテストの準備ができたら、next
にマージされます。 多くの初期のテスターは next
を使用し、問題を報告する可能性があります。 最終的に、 next
を変更すると、通常は安定していると見なされる master
になります。 最後に、新しいリリースが出ると、 maint
がバグ修正のベースとして使用されます。 このドキュメントの冒頭で述べたように、さまざまな統合ブランチの使用に関する詳細については、「Documents/SubmittingPatches」を参照してください。
話を戻します。 今や、 あなたのコードは上流のレビューアから賞賛されています。 あなたのコードは完璧で、 受け入れられる準備ができています。 他に何もする必要はありません。 メンテナはトピックブランチを next
にマージし、最高な気分ですおすし。
しかしながら、この時点以降に完全ではないことにあなたが気付いた場合は、あなたがプロセスのどこにいるかに応じて、いくつかの特別な手順を実行する必要があります。
メンテナが「What’s cooking in git.git」メールで、あなたのトピックに「next」のマークが付けられていることを発表した場合、つまり、トピックを「next」にマージする予定であるが、まだマージしていない場合は、 メンテナにもう少し待つように依頼するメールを送るべきです: 「シリーズのv4を送信し、 next
のマークを付けましたが、これを変更する必要があります。v5を待ってからマージしてください。」
トピックがすでに next
にマージされている場合は、git rebase -i
でパッチを修正するのではなく、インクリメンタルに、つまり https://github.com/gitster/git にあるようにメンテナのトピックブランチを基点として別のコミットで変更を加えてください。 あなたの仕事はまだ同じトピックにありますが、トピックブランチの大規模な書き直しではなく、インクリメンタルになっています。
メンテナのGitHubのトピックブランチはGitGitGadgetにミラーリングされているため、レビューをそのように送信する場合は、適切なGitGitGadget/Gitブランチに対してPRを開く必要があります。
git send-email
を使用している場合は、以前と同じように使用できますが、 <topic>..<mybranch>
からdiffを生成し、 master
の代わりに <topic>
に基づいて作業する必要があります。