章 ▾ 第2版

6.3 GitHub - プロジェクトの管理

プロジェクトの管理

プロジェクトへの貢献に慣れてきたところで、もう一方の側面、つまり独自のプロジェクトを作成し、保守し、管理する方法を見てみましょう。

新しいリポジトリの作成

プロジェクトのコードを共有するための新しいリポジトリを作成しましょう。ダッシュボードの右側にある「New repository」ボタンをクリックするか、ユーザー名の隣にあるトップツールバーの+ボタンから開始します(「New repository」ドロップダウン参照)。

The “Your repositories” area
図109. 「Your repositories」エリア
The “New repository” dropdown
図110. 「New repository」ドロップダウン

これにより、「new repository」フォームが表示されます。

The “new repository” form
図111. 「new repository」フォーム

ここで実際に行う必要があるのは、プロジェクト名を提供することだけです。残りのフィールドはすべて任意です。今のところ、「Create Repository」ボタンをクリックするだけで、<user>/<project_name>という名前の新しいリポジトリがGitHubに作成されます。

まだコードがないため、GitHubは新しいGitリポジトリを作成したり、既存のGitプロジェクトを接続したりする方法の指示を表示します。ここでは詳しく説明しません。復習が必要な場合は、Gitの基本を確認してください。

プロジェクトがGitHubでホストされたので、プロジェクトを共有したい相手にURLを伝えることができます。GitHub上のすべてのプロジェクトは、HTTPSではhttps://github.com/<user>/<project_name>として、SSHではgit@github.com:<user>/<project_name>としてアクセスできます。GitはこれらのURLの両方からフェッチおよびプッシュできますが、接続するユーザーの認証情報に基づいてアクセスが制御されます。

公開プロジェクトの場合、ユーザーがクローンするためにGitHubアカウントを持つ必要がないため、HTTPSベースのURLを共有する方がしばしば望ましいです。SSH URLを提供する場合、ユーザーはアカウントを持ち、SSHキーをアップロードしている必要があります。HTTPSのURLは、ブラウザに貼り付けてプロジェクトを閲覧するのとまったく同じURLでもあります。

コラボレーターの追加

コミットアクセスを与えたい他の人と作業している場合は、彼らを「コラボレーター」として追加する必要があります。Ben、Jeff、Louiseが全員GitHubでアカウントを登録し、あなたが彼らにリポジトリへのプッシュアクセスを与えたい場合、彼らをプロジェクトに追加することができます。そうすることで、彼らは「プッシュ」アクセス権を得て、プロジェクトとGitリポジトリの両方に対する読み取りと書き込みのアクセス権を持つことになります。

右側のサイドバーの下部にある「Settings」リンクをクリックします。

The repository settings link
図112. リポジトリ設定リンク

次に、左側のメニューから「Collaborators」を選択します。次に、ボックスにユーザー名を入力し、「Add collaborator」をクリックするだけです。好きなだけこれを繰り返して、アクセス権を付与できます。アクセス権を取り消す必要がある場合は、その行の右側にある「X」をクリックするだけです。

The repository collaborators box
図113. リポジトリコラボレーターボックス

プルリクエストの管理

コードを含むプロジェクトがあり、プッシュアクセスを持つコラボレーターが何人かいる場合、プルリクエストを自分で受け取ったときに何をすべきかを説明しましょう。

プルリクエストは、リポジトリのフォーク内のブランチから来ることもあれば、同じリポジトリ内の別のブランチから来ることもあります。唯一の違いは、フォーク内のものは、通常、あなたのブランチにプッシュできず、彼らのブランチにプッシュできない人々からのものであるのに対し、内部のプルリクエストでは、通常、両当事者がブランチにアクセスできることです。

これらの例では、あなたが「tonychacon」であり、「fade」という新しいArduinoコードプロジェクトを作成したと仮定します。

メール通知

誰かがあなたのコードに変更を加え、プルリクエストを送信してきました。新しいプルリクエストについて通知するメールが届くはずで、それは新しいプルリクエストのメール通知のようになるはずです。

Email notification of a new Pull Request
図114. 新しいプルリクエストのメール通知

このメールにはいくつか注意すべき点があります。プルリクエストで変更されたファイルとその変更量をリストした小さなdiffstatが提供されます。GitHub上のプルリクエストへのリンクも提供されます。また、コマンドラインから使用できるいくつかのURLも提供されます。

git pull <url> patch-1という行に注目すると、これはリモートを追加せずにリモートブランチをマージする簡単な方法です。これについては、リモートブランチのチェックアウトで簡単に説明しました。必要であれば、トピックブランチを作成して切り替えてから、このコマンドを実行してプルリクエストの変更をマージすることができます。

その他の興味深いURLは.diffおよび.patch URLで、ご想像のとおり、プルリクエストの統一diffおよびパッチバージョンを提供します。技術的には、次のような方法でプルリクエストの作業をマージできます。

$ curl https://github.com/tonychacon/fade/pull/1.patch | git am

プルリクエストでの共同作業

GitHubフローで説明したように、プルリクエストを開いた人と会話できるようになりました。GitHub Flavored Markdownを使用して、特定のコード行、コミット全体、またはプルリクエスト自体全体にコメントできます。

他の誰かがプルリクエストにコメントするたびに、あなたは引き続きメール通知を受け取り、アクティビティが発生していることを知ることができます。それぞれの通知には、アクティビティが発生しているプルリクエストへのリンクがあり、メールに直接返信してプルリクエストのスレッドにコメントすることもできます。

Responses to emails are included in the thread
図115. メールへの返信はスレッドに含まれる

コードが満足のいく状態になり、マージしたい場合は、以前に見たgit pull <url> <branch>構文を使用するか、フォークをリモートとして追加してフェッチおよびマージすることで、コードをプルしてローカルでマージできます。

マージが単純な場合は、GitHubサイトの「Merge」ボタンをクリックするだけでも構いません。これにより、「ノンファストフォワード」マージが実行され、ファストフォワードマージが可能であった場合でもマージコミットが作成されます。つまり、マージボタンをクリックするたびに、必ずマージコミットが作成されます。マージボタンとプルリクエストを手動でマージする手順でわかるように、ヒントリンクをクリックすると、GitHubがこのすべての情報を提供します。

Merge button and instructions for merging a Pull Request manually
図116. マージボタンとプルリクエストを手動でマージする手順

マージしたくないと判断した場合は、プルリクエストを閉じるだけで、プルリクエストを開いた人に通知されます。

プルリクエストのRef

多くのプルリクエストを扱っていて、たくさんのリモートを追加したり、毎回一度だけプルしたりしたくない場合は、GitHubが提供する便利なトリックがあります。これは少し高度なトリックで、これについてはRefspecでさらに詳しく説明しますが、非常に役立つことがあります。

GitHubは、実際にはリポジトリのプルリクエストブランチを、サーバー上の擬似ブランチとして公開しています。デフォルトでは、クローン時にこれらは取得されませんが、隠された形で存在し、非常に簡単にアクセスできます。

これを実証するために、低レベルのコマンド(「plumbing」コマンドと呼ばれ、PlumbingとPorcelainで詳しく説明します)であるls-remoteを使用します。このコマンドは通常、日常のGit操作では使用されませんが、サーバーにどのような参照が存在するかを示すのに役立ちます。

以前使用していた「blink」リポジトリに対してこのコマンドを実行すると、リポジトリ内のすべてのブランチ、タグ、およびその他の参照のリストが取得されます。

$ git ls-remote https://github.com/schacon/blink
10d539600d86723087810ec636870a504f4fee4d	HEAD
10d539600d86723087810ec636870a504f4fee4d	refs/heads/master
6a83107c62950be9453aac297bb0193fd743cd6e	refs/pull/1/head
afe83c2d1a70674c9505cc1d8b7d380d5e076ed3	refs/pull/1/merge
3c8d735ee16296c242be7a9742ebfbc2665adec1	refs/pull/2/head
15c9f4f80973a2758462ab2066b6ad9fe8dcf03d	refs/pull/2/merge
a5a7751a33b7e86c5e9bb07b26001bb17d775d1a	refs/pull/4/head
31a45fc257e8433c8d8804e3e848cf61c9d3166c	refs/pull/4/merge

もちろん、リポジトリ内でgit ls-remote originまたは確認したい任意のリモートを実行すると、これに似たものが表示されます。

リポジトリがGitHub上にあり、開いているプルリクエストがある場合、refs/pull/というプレフィックスが付いたこれらの参照が取得されます。これらは基本的にブランチですが、refs/heads/の下にはないため、通常はクローンやサーバーからのフェッチ時には取得されません。フェッチのプロセスでは通常これらは無視されます。

プルリクエストごとに2つの参照があります。/headで終わる参照は、プルリクエストブランチの最後のコミットとまったく同じコミットを指します。したがって、誰かが私たちのリポジトリでプルリクエストを開き、そのブランチ名がbug-fixで、それがコミットa5a775を指している場合、**私たちの**リポジトリにはbug-fixブランチはありません(それは彼らのフォークにあるため)が、pull/<pr#>/heada5a775を指しています。これは、多くのリモートを追加することなく、すべてのプルリクエストブランチを一度に簡単にプルできることを意味します。

これで、参照を直接フェッチするようなことができます。

$ git fetch origin refs/pull/958/head
From https://github.com/libgit2/libgit2
 * branch            refs/pull/958/head -> FETCH_HEAD

これはGitに「originリモートに接続し、refs/pull/958/headという名前の参照をダウンロードする」と伝えます。Gitは喜んで従い、その参照を構築するために必要なすべてをダウンロードし、目的のコミットへのポインタを.git/FETCH_HEADの下に置きます。その後に、テストしたいブランチにgit merge FETCH_HEADを実行できますが、そのマージコミットメッセージは少し奇妙に見えます。また、**たくさんの**プルリクエストをレビューしていると、これは面倒になります。

すべてのプルリクエストをフェッチし、リモートに接続するたびに最新の状態に保つ方法もあります。お気に入りのエディタで.git/configを開き、originリモートを探してください。それは次のようなものになっているはずです。

[remote "origin"]
    url = https://github.com/libgit2/libgit2
    fetch = +refs/heads/*:refs/remotes/origin/*

fetch =で始まる行は「refspec」です。これはリモート上の名前をローカルの.gitディレクトリ内の名前とマッピングする方法です。この特定のものはGitに「リモート上のrefs/heads下のものは私のローカルリポジトリのrefs/remotes/origin下に行くべきだ」と伝えています。このセクションを修正して別のrefspecを追加できます。

[remote "origin"]
    url = https://github.com/libgit2/libgit2.git
    fetch = +refs/heads/*:refs/remotes/origin/*
    fetch = +refs/pull/*/head:refs/remotes/origin/pr/*

この最後の行はGitに「refs/pull/123/headのようなすべての参照をローカルにrefs/remotes/origin/pr/123として保存する」と伝えています。これで、そのファイルを保存してgit fetchを実行すると、

$ git fetch
# …
 * [new ref]         refs/pull/1/head -> origin/pr/1
 * [new ref]         refs/pull/2/head -> origin/pr/2
 * [new ref]         refs/pull/4/head -> origin/pr/4
# …

これで、すべてのリモートプルリクエストがローカルで参照として表現され、追跡ブランチと非常によく似た動作をします。これらは読み取り専用で、フェッチを行うと更新されます。これにより、プルリクエストのコードをローカルで簡単に試すことができます。

$ git checkout pr/2
Checking out files: 100% (3769/3769), done.
Branch pr/2 set up to track remote branch pr/2 from origin.
Switched to a new branch 'pr/2'

鋭い目を持つ読者は、refspecのリモート部分の最後にheadが付いていることに気づくでしょう。GitHub側にはrefs/pull/#/mergeという参照もあり、これはサイトで「merge」ボタンを押した場合に結果として生じるコミットを表します。これにより、ボタンを押す前にマージをテストできます。

プルリクエストに対するプルリクエスト

メインまたはmasterブランチをターゲットとするプルリクエストを開くだけでなく、ネットワーク内の任意のブランチをターゲットとするプルリクエストを開くこともできます。実際、別のプルリクエストをターゲットにすることもできます。

正しい方向に向かっているプルリクエストを見つけ、それに依存する変更のアイデアがある場合、またはそれが良いアイデアかどうかわからない場合、あるいはターゲットブランチへのプッシュアクセスがないだけの場合でも、直接それに対してプルリクエストを開くことができます。

プルリクエストを開くと、ページの上部に、どのブランチにプルをリクエストしているか、どのブランチからプルをリクエストしているかを指定するボックスがあります。そのボックスの右側にある「Edit」ボタンをクリックすると、ブランチだけでなくフォークも変更できます。

Manually change the Pull Request target fork and branch
図117. プルリクエストのターゲットフォークとブランチを手動で変更する

ここでは、新しいブランチを別のプルリクエストまたはプロジェクトの別のフォークにマージするように非常に簡単に指定できます。

メンションと通知

GitHubには非常に優れた通知システムも組み込まれており、特定の個人やチームからの質問やフィードバックが必要な場合に非常に便利です。

コメントのどこでも@文字を入力し始めると、プロジェクトのコラボレーターや貢献者の名前とユーザー名のオートコンプリートが開始されます。

Start typing @ to mention someone
図118. 誰かをメンションするために@を入力し始める

そのドロップダウンにないユーザーをメンションすることもできますが、多くの場合、オートコンプリート機能によってより迅速に行うことができます。

ユーザーメンションを含むコメントを投稿すると、そのユーザーに通知が送信されます。これは、人々をポーリングさせるのではなく、会話に引き込む非常に効果的な方法となり得ます。GitHubのプルリクエストでは、人々がチームの他のメンバーや会社の他のメンバーを引っ張ってきて、Issueやプルリクエストをレビューさせることが非常によくあります。

誰かがプルリクエストやIssueでメンションされると、彼らはそれに「購読」され、そこで何らかのアクティビティが発生するたびに通知を受け取り続けます。また、あなたがそれを開いた場合、リポジトリをウォッチしている場合、または何かについてコメントした場合も、それに購読されます。通知を受け取りたくなくなった場合は、ページにある「Unsubscribe」ボタンをクリックして、その更新の受信を停止できます。

Unsubscribe from an Issue or Pull Request
図119. Issueまたはプルリクエストの購読解除

通知ページ

ここでGitHubに関して「通知」と述べる場合、それはGitHubがイベント発生時にあなたに連絡を取ろうとする特定の方法を意味し、いくつかの異なる設定方法があります。設定ページの「Notification center」タブに移動すると、利用可能なオプションの一部を確認できます。

Notification center options
図120. 通知センターオプション

2つの選択肢は、「Email」と「Web」で通知を受け取ることで、積極的に参加しているものと、ウォッチしているリポジトリのアクティビティについて、どちらか、どちらでもない、または両方を選択できます。

ウェブ通知

ウェブ通知はGitHub上のみに存在し、GitHub上でしか確認できません。このオプションを環境設定で選択しており、通知がトリガーされた場合、通知センターに示すように、画面上部の通知アイコンの上に小さな青い点が表示されます。

Notification center
図121. 通知センター

それをクリックすると、プロジェクトごとにグループ化された、通知されたすべての項目のリストが表示されます。左側のサイドバーでプロジェクト名をクリックすることで、特定のプロジェクトの通知に絞り込むことができます。また、通知の横にあるチェックマークアイコンをクリックして通知を既読にしたり、グループの先頭にあるチェックマークをクリックしてプロジェクトの*すべての*通知を既読にすることもできます。各チェックマークの横にはミュートボタンもあり、クリックするとその項目に関するそれ以上の通知を受け取らなくなります。

これらのツールはすべて、大量の通知を処理するのに非常に役立ちます。多くのGitHubパワーユーザーは、メール通知を完全にオフにして、この画面ですべての通知を管理します。

メール通知

メール通知は、GitHubを通じて通知を処理するもう一つの方法です。これをオンにすると、通知ごとにメールが届きます。これの例は、メール通知として送信されたコメント新しいプルリクエストのメール通知で確認しました。メールも適切にスレッド化されるため、スレッド表示機能のあるメールクライアントを使用している場合は便利です。

GitHubが送信するメールのヘッダーには、かなりの量のメタデータが埋め込まれており、カスタムフィルタやルールの設定に非常に役立ちます。

例えば、新しいプルリクエストのメール通知に示されているTonyに送信された実際のメールヘッダーを見ると、送信された情報の中に次のようなものが見られます。

To: tonychacon/fade <fade@noreply.github.com>
Message-ID: <tonychacon/fade/pull/1@github.com>
Subject: [fade] Wait longer to see the dimming effect better (#1)
X-GitHub-Recipient: tonychacon
List-ID: tonychacon/fade <fade.tonychacon.github.com>
List-Archive: https://github.com/tonychacon/fade
List-Post: <mailto:reply+i-4XXX@reply.github.com>
List-Unsubscribe: <mailto:unsub+i-XXX@reply.github.com>,...
X-GitHub-Recipient-Address: tchacon@example.com

ここにはいくつかの興味深い点があります。この特定のプロジェクト、あるいはプルリクエストへのメールを強調表示したり、ルーティングしたりしたい場合は、Message-IDの情報が<user>/<project>/<type>/<id>形式ですべてのデータを提供します。例えば、これがissueだった場合、<type>フィールドは「pull」ではなく「issues」になっていたでしょう。

List-PostList-Unsubscribeフィールドは、これらを理解するメールクライアントがあれば、リストに簡単に投稿したり、スレッドから「購読解除」したりできることを意味します。これは、通知のWebバージョンで「ミュート」ボタンをクリックしたり、Issueまたはプルリクエストページ自体で「Unsubscribe」をクリックしたりするのと本質的に同じです。

また、メール通知とウェブ通知の両方を有効にしていて、メールクライアントで画像が許可されている場合、メール版の通知を読むと、ウェブ版も既読としてマークされることにも注意してください。

特殊なファイル

GitHubは、リポジトリに存在する場合に認識するいくつかの特殊なファイルがあります。

README

一つ目はREADMEファイルで、GitHubが散文として認識するほぼあらゆる形式が可能です。例えば、READMEREADME.mdREADME.asciidocなどです。GitHubがソースコード内にREADMEファイルを見つけると、それをプロジェクトのランディングページにレンダリングします。

多くのチームは、このファイルを使用して、リポジトリやプロジェクトに不慣れな人にとって関連するすべてのプロジェクト情報を保持しています。これには通常、次のようなものが含まれます。

  • プロジェクトの目的

  • 設定とインストール方法

  • 使用例または実行方法の例

  • プロジェクトが提供されるライセンス

  • 貢献方法

GitHubはこのファイルをレンダリングするため、理解を深めるために画像やリンクを埋め込むことができます。

CONTRIBUTING

GitHubが認識するもう一つの特殊ファイルはCONTRIBUTINGファイルです。任意のファイル拡張子を持つCONTRIBUTINGという名前のファイルがある場合、誰かがプルリクエストを開き始めると、GitHubはCONTRIBUTINGファイルが存在する場合のプルリクエストのオープンを表示します。

Opening a Pull Request when a CONTRIBUTING file exists
図122. CONTRIBUTINGファイルが存在する場合のプルリクエストのオープン

ここでのアイデアは、プロジェクトに送信されるプルリクエストに含めてほしい、あるいは含めてほしくない特定の事項を指定できることです。これにより、人々はプルリクエストを開く前に実際にガイドラインを読むかもしれません。

プロジェクト管理

一般的に、単一のプロジェクトでできる管理上のことは多くありませんが、いくつか興味深い項目があります。

デフォルトブランチの変更

「master」以外のブランチをデフォルトブランチとして使用していて、人々がプルリクエストを開いたり、デフォルトで表示したりしたい場合は、リポジトリの設定ページの「Options」タブで変更できます。

Change the default branch for a project
図123. プロジェクトのデフォルトブランチを変更する

ドロップダウンでデフォルトブランチを変更するだけで、それ以降のすべての主要な操作のデフォルトブランチになります。これには、誰かがリポジトリをクローンしたときにデフォルトでチェックアウトされるブランチも含まれます。

プロジェクトの転送

プロジェクトを別のユーザーまたはGitHub内の組織に転送したい場合は、リポジトリ設定ページの同じ「Options」タブの下部に「Transfer ownership」オプションがあり、これを行うことができます。

Transfer a project to another GitHub user or Organization
図124. プロジェクトを別のGitHubユーザーまたは組織に転送する

これは、プロジェクトを放棄して誰かに引き継いでもらいたい場合や、プロジェクトが大きくなり組織に移行したい場合に役立ちます。

これにより、リポジトリとそのすべてのウォッチャーとスターが別の場所に移動するだけでなく、元のURLから新しい場所へのリダイレクトも設定されます。Webリクエストだけでなく、Gitからのクローンやフェッチもリダイレクトされます。

scroll-to-top