-
1. Gitを始めるにあたって
- 1.1 バージョン管理について
- 1.2 Gitの歴史
- 1.3 Gitとは何か?
- 1.4 コマンドライン
- 1.5 Gitのインストール
- 1.6 Gitの初回セットアップ
- 1.7 ヘルプの利用
- 1.8 まとめ
-
2. Gitの基本
- 2.1 Gitリポジトリの取得
- 2.2 リポジトリへの変更の記録
- 2.3 コミット履歴の表示
- 2.4 元に戻す操作
- 2.5 リモートでの作業
- 2.6 タグ付け
- 2.7 Gitエイリアス
- 2.8 まとめ
-
3. Gitのブランチ機能
- 3.1 ブランチの基本
- 3.2 基本的なブランチとマージ
- 3.3 ブランチ管理
- 3.4 ブランチワークフロー
- 3.5 リモートブランチ
- 3.6 リベース
- 3.7 まとめ
-
4. サーバー上のGit
- 4.1 プロトコル
- 4.2 サーバーにGitをセットアップする
- 4.3 SSH公開鍵の生成
- 4.4 サーバーのセットアップ
- 4.5 Gitデーモン
- 4.6 スマートHTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 サードパーティのホスティングオプション
- 4.10 まとめ
-
5. 分散Git
- 5.1 分散ワークフロー
- 5.2 プロジェクトへの貢献
- 5.3 プロジェクトの管理
- 5.4 まとめ
-
6. GitHub
- 6.1 アカウントのセットアップと設定
- 6.2 プロジェクトへの貢献
- 6.3 プロジェクトの管理
- 6.4 組織の管理
- 6.5 GitHubのスクリプティング
- 6.6 まとめ
-
7. Gitツール
- 7.1 リビジョンの選択
- 7.2 インタラクティブステージング
- 7.3 スタッシュとクリーン
- 7.4 作業に署名する
- 7.5 検索
- 7.6 履歴の書き換え
- 7.7 Resetの解明
- 7.8 高度なマージ
- 7.9 Rerere
- 7.10 Gitを使ったデバッグ
- 7.11 サブモジュール
- 7.12 バンドル
- 7.13 置換
- 7.14 認証情報の保存
- 7.15 まとめ
-
8. Gitのカスタマイズ
- 8.1 Gitの設定
- 8.2 Git属性
- 8.3 Gitフック
- 8.4 Gitによるポリシー適用例
- 8.5 まとめ
-
9. Gitと他のシステム
- 9.1 クライアントとしてのGit
- 9.2 Gitへの移行
- 9.3 まとめ
-
10. Gitの内側
- 10.1 PlumbingとPorcelain
- 10.2 Gitオブジェクト
- 10.3 Gitリファレンス
- 10.4 Packfile
- 10.5 Refspec
- 10.6 転送プロトコル
- 10.7 メンテナンスとデータ復旧
- 10.8 環境変数
- 10.9 まとめ
-
A1. 付録A: 他の環境でのGit
- A1.1 グラフィカルインターフェース
- A1.2 Visual StudioでのGit
- A1.3 Visual Studio CodeでのGit
- A1.4 IntelliJ / PyCharm / WebStorm / PhpStorm / RubyMineでのGit
- A1.5 Sublime TextでのGit
- A1.6 BashでのGit
- A1.7 ZshでのGit
- A1.8 PowerShellでのGit
- A1.9 まとめ
-
A2. 付録B: アプリケーションへのGitの組み込み
- A2.1 コマンドラインGit
- A2.2 Libgit2
- A2.3 JGit
- A2.4 go-git
- A2.5 Dulwich
-
A3. 付録C: Gitコマンド
- A3.1 セットアップと設定
- A3.2 プロジェクトの取得と作成
- A3.3 基本的なスナップショット
- A3.4 ブランチとマージ
- A3.5 プロジェクトの共有と更新
- A3.6 検査と比較
- A3.7 デバッグ
- A3.8 パッチ適用
- A3.9 メール
- A3.10 外部システム
- A3.11 管理
- A3.12 Plumbingコマンド
6.5 GitHub - GitHubのスクリプティング
GitHubのスクリプティング
これまでにGitHubの主要な機能とワークフローをすべてカバーしてきましたが、どんな大規模なグループやプロジェクトでも、カスタマイズしたい点や統合したい外部サービスがあるかもしれません。
幸いなことに、GitHubは多くの点で非常にハック可能です。このセクションでは、GitHubフックシステムとそのAPIを使用して、GitHubを望むように動作させる方法を説明します。
サービスとフック
GitHubリポジトリ管理の「Hooks and Services」セクションは、GitHubを外部システムと連携させる最も簡単な方法です。
サービス
まず、サービスを見てみましょう。フックとサービスの両方の統合は、リポジトリの「Settings」セクションにあります。ここでは以前、コラボレーターの追加やプロジェクトのデフォルトブランチの変更について説明しました。「Webhooks and Services」タブの下に、サービスとフックの設定セクションのようなものが表示されます。

何十ものサービスから選択でき、そのほとんどは他の商用およびオープンソースシステムへの統合です。その多くは継続的インテグレーションサービス、バグ・課題トラッカー、チャットルームシステム、ドキュメントシステム向けです。ここでは、非常にシンプルなメールフックの設定を説明します。「Add Service」ドロップダウンから「email」を選択すると、メールサービスの設定のような設定画面が表示されます。

この場合、「Add service」ボタンを押すと、指定したメールアドレスに、誰かがリポジトリにプッシュするたびにメールが届きます。サービスはさまざまな種類のイベントをリッスンできますが、ほとんどはプッシュイベントのみをリッスンし、そのデータで何かを行います。
GitHubと統合したいシステムを使用している場合は、既存のサービス統合が利用可能かどうかここで確認してください。たとえば、Jenkinsを使用してコードベースでテストを実行している場合、Jenkinsの組み込みサービス統合を有効にして、誰かがリポジトリにプッシュするたびにテスト実行を開始できます。
フック
より具体的なものが必要な場合や、このリストに含まれていないサービスやサイトと統合したい場合は、より汎用的なフックシステムを使用できます。GitHubリポジトリフックは非常にシンプルです。URLを指定すると、GitHubは指定したイベントでそのURLにHTTPペイロードを投稿します。
一般的に、これはGitHubフックペイロードをリッスンする小さなWebサービスを設定し、データが受信されたときにそのデータで何かを行うという方法で機能します。
フックを有効にするには、サービスとフックの設定セクションの「Add webhook」ボタンをクリックします。これにより、Webフックの設定のようなページが表示されます。

Webフックの設定は非常にシンプルです。ほとんどの場合、URLと秘密鍵を入力し、「Add webhook」を押すだけです。GitHubにペイロードを送信させたいイベントにはいくつかのオプションがあります。デフォルトでは、誰かがリポジトリの任意のブランチに新しいコードをプッシュしたときにのみ、push
イベントのペイロードを取得します。
Webフックを処理するために設定できるWebサービスの小さな例を見てみましょう。ここではRubyのWebフレームワークSinatraを使用します。これは非常に簡潔で、何をしているのか簡単に理解できるはずです。
特定の人がプロジェクトの特定のブランチに特定のファイルを変更してプッシュした場合にメールを受信したいとしましょう。これは次のようなコードでかなり簡単に行うことができます。
require 'sinatra'
require 'json'
require 'mail'
post '/payload' do
push = JSON.parse(request.body.read) # parse the JSON
# gather the data we're looking for
pusher = push["pusher"]["name"]
branch = push["ref"]
# get a list of all the files touched
files = push["commits"].map do |commit|
commit['added'] + commit['modified'] + commit['removed']
end
files = files.flatten.uniq
# check for our criteria
if pusher == 'schacon' &&
branch == 'ref/heads/special-branch' &&
files.include?('special-file.txt')
Mail.deliver do
from 'tchacon@example.com'
to 'tchacon@example.com'
subject 'Scott Changed the File'
body "ALARM"
end
end
end
ここでは、GitHubが配信するJSONペイロードを取得し、誰がプッシュしたか、どのブランチにプッシュしたか、プッシュされたすべてのコミットでどのファイルが変更されたかを検索しています。次に、それを基準と照合し、一致すればメールを送信します。
このようなものを開発してテストするために、フックを設定したのと同じ画面に便利な開発者コンソールがあります。そのWebフックに対してGitHubが試みた最後のいくつかの配信を見ることができます。各フックについて、いつ配信されたか、成功したかどうか、リクエストとレスポンスの両方の本文とヘッダーを深く掘り下げて見ることができます。これにより、フックのテストとデバッグが非常に簡単になります。

もう一つの素晴らしい機能は、サービスを簡単にテストするために、任意のペイロードを再配信できることです。
Webフックの書き方やリッスンできるさまざまなイベントタイプに関する詳細については、GitHub開発者ドキュメント(https://docs.github.com/en/webhooks-and-events/webhooks/about-webhooks)をご覧ください。
GitHub API
サービスとフックは、リポジトリで発生するイベントに関するプッシュ通知を受信する手段を提供しますが、これらのイベントについてさらに情報が必要な場合はどうでしょうか?コラボレーターの追加や課題のラベル付けなどを自動化する必要がある場合はどうでしょうか?
ここでGitHub APIが役立ちます。GitHubには、ウェブサイトでできることのほとんどすべてを自動化された方法で行うためのAPIエンドポイントが多数あります。このセクションでは、APIの認証と接続方法、課題へのコメント方法、APIを通じてプルリクエストのステータスを変更する方法を学びます。
基本的な使い方
最も基本的なことは、認証を必要としないエンドポイントに対する単純なGETリクエストです。これは、ユーザーに関する情報やオープンソースプロジェクトの読み取り専用情報である可能性があります。たとえば、「schacon」という名前のユーザーについて詳しく知りたい場合は、次のようなものを実行できます。
$ curl https://api.github.com/users/schacon
{
"login": "schacon",
"id": 70,
"avatar_url": "https://avatars.githubusercontent.com/u/70",
# …
"name": "Scott Chacon",
"company": "GitHub",
"following": 19,
"created_at": "2008-01-27T17:19:28Z",
"updated_at": "2014-06-10T02:37:23Z"
}
組織、プロジェクト、課題、コミットなど、GitHubで公開されているほとんどすべての情報について、このようなエンドポイントが多数あります。APIを使用して任意のMarkdownをレンダリングしたり、.gitignore
テンプレートを見つけたりすることもできます。
$ curl https://api.github.com/gitignore/templates/Java
{
"name": "Java",
"source": "*.class
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
*.jar
*.war
*.ear
# virtual machine crash logs, see https://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
"
}
課題へのコメント
ただし、課題やプルリクエストへのコメントなど、ウェブサイトでアクションを実行したい場合や、プライベートなコンテンツを表示したり操作したりしたい場合は、認証が必要です。
認証にはいくつかの方法があります。ユーザー名とパスワードのみで基本認証を使用できますが、一般的には個人アクセストークンを使用することをお勧めします。これは、設定ページの「Applications」タブから生成できます。

このトークンにどのスコープを適用するか、および説明が求められます。スクリプトやアプリケーションが使用されなくなったときにトークンを安心して削除できるように、適切な説明を使用してください。
GitHubはトークンを一度しか表示しないので、必ずコピーしてください。これで、ユーザー名とパスワードを使用する代わりに、スクリプトで認証に使用できます。これは、実行したいことのスコープを制限でき、トークンが失効可能であるため便利です。
これにより、レート制限が向上するという追加の利点もあります。認証なしでは、1時間あたり60リクエストに制限されます。認証すると、1時間あたり最大5,000リクエストを行うことができます。
では、これを使って課題の1つにコメントをしてみましょう。特定の課題、Issue #6にコメントを残したいとします。これを行うには、repos/<user>/<repo>/issues/<num>/comments
に、生成したトークンをAuthorizationヘッダーとして含むHTTP POSTリクエストを行う必要があります。
$ curl -H "Content-Type: application/json" \
-H "Authorization: token TOKEN" \
--data '{"body":"A new comment, :+1:"}' \
https://api.github.com/repos/schacon/blink/issues/6/comments
{
"id": 58322100,
"html_url": "https://github.com/schacon/blink/issues/6#issuecomment-58322100",
...
"user": {
"login": "tonychacon",
"id": 7874698,
"avatar_url": "https://avatars.githubusercontent.com/u/7874698?v=2",
"type": "User",
},
"created_at": "2014-10-08T07:48:19Z",
"updated_at": "2014-10-08T07:48:19Z",
"body": "A new comment, :+1:"
}
これでその課題にアクセスすると、GitHub APIから投稿されたコメントのように、投稿したコメントが表示されます。

APIを使用すると、ウェブサイトでできるほとんどすべてのことができます。マイルストーンの作成と設定、課題やプルリクエストへの人の割り当て、ラベルの作成と変更、コミットデータへのアクセス、新しいコミットとブランチの作成、プルリクエストのオープン、クローズ、マージ、チームの作成と編集、プルリクエストのコード行へのコメント、サイトの検索など、多岐にわたります。
プルリクエストのステータスの変更
プルリクエストを扱う場合に非常に役立つので、もう1つの例を見てみましょう。各コミットには1つ以上のステータスが関連付けられており、そのステータスを追加およびクエリするためのAPIがあります。
ほとんどの継続的インテグレーションおよびテストサービスは、このAPIを利用して、プッシュされたコードをテストすることでプッシュに反応し、そのコミットがすべてのテストに合格したかどうかを報告します。これを使用して、コミットメッセージが適切にフォーマットされているか、提出者がすべての貢献ガイドラインに従ったか、コミットが有効に署名されたかなど、さまざまなことをチェックできます。
コミットメッセージにSigned-off-by
文字列があるかどうかをチェックする小さなWebサービスをヒットするWebフックをリポジトリに設定したとします。
require 'httparty'
require 'sinatra'
require 'json'
post '/payload' do
push = JSON.parse(request.body.read) # parse the JSON
repo_name = push['repository']['full_name']
# look through each commit message
push["commits"].each do |commit|
# look for a Signed-off-by string
if /Signed-off-by/.match commit['message']
state = 'success'
description = 'Successfully signed off!'
else
state = 'failure'
description = 'No signoff found.'
end
# post status to GitHub
sha = commit["id"]
status_url = "https://api.github.com/repos/#{repo_name}/statuses/#{sha}"
status = {
"state" => state,
"description" => description,
"target_url" => "http://example.com/how-to-signoff",
"context" => "validate/signoff"
}
HTTParty.post(status_url,
:body => status.to_json,
:headers => {
'Content-Type' => 'application/json',
'User-Agent' => 'tonychacon/signoff',
'Authorization' => "token #{ENV['TOKEN']}" }
)
end
end
これが比較的簡単に理解できることを願っています。このWebフックハンドラーでは、プッシュされた各コミットを調べ、コミットメッセージ内の「Signed-off-by」文字列を探し、最後にHTTP POSTを/repos/<user>/<repo>/statuses/<commit_sha>
APIエンドポイントにステータスと共に送信します。
この場合、状態(「success」、「failure」、「error」)、何が起こったかの説明、詳細情報のためにユーザーがアクセスできるターゲットURL、および単一のコミットに複数のステータスがある場合の「コンテキスト」を送信できます。たとえば、テストサービスがステータスを提供し、このような検証サービスもステータスを提供する場合があります。この「コンテキスト」フィールドは、それらを区別する方法です。
誰かがGitHubで新しいプルリクエストを開き、このフックが設定されている場合、APIを介したコミットステータスのようなものが表示されるかもしれません。

これで、メッセージに「Signed-off-by」文字列が含まれているコミットの横に小さな緑色のチェックマークが、署名を忘れた著者のコミットには赤色のXが表示されていることがわかります。また、プルリクエストがブランチの最後のコミットのステータスを受け取り、それが失敗した場合は警告することもわかります。これは、このAPIをテスト結果に使用している場合に非常に便利で、最後のコミットがテストに失敗しているものを誤ってマージするのを防ぐことができます。
Octokit
これらの例ではほとんどすべてcurl
と単純なHTTPリクエストを介して行いましたが、このAPIをより慣用的な方法で利用可能にするいくつかのオープンソースライブラリが存在します。この記事の執筆時点では、サポートされている言語にはGo、Objective-C、Ruby、.NETが含まれます。これらのライブラリはHTTPの多くを処理してくれるので、詳細についてはhttps://github.com/octokitをご覧ください。
これらのツールが、GitHubを特定のワークフローに合わせてカスタマイズおよび変更するのに役立つことを願っています。API全体の完全なドキュメントと一般的なタスクのガイドについては、https://docs.github.com/をご覧ください。