GitHub APIでIssueを操作する with PHP

GitHubへ一度に大量のIssueの登録をしなければならない、プロジェクト開始時などよくあるシチュエーションかと思います。10件や20件程度なら手作業でも良いのですが、数十個を超えてくるとさすがに人間でやるのは大変すぎるので機械にお願いしたいところ。

今回はGitHub APIをPHPから利用し、Issueの登録と更新、一覧の取得を行いたいと思います。

GitHub API

GitHubには開発者用に各種APIが整備されており、RESTful APIGraphQLを用いて様々な操作を行うことができます。

おとこらしくcurlなどで実装してもよいのですが、すでに公開されているライブラリの中から好みの物を用いてIssueの操作を行います。本来の目的は楽をするはずなのに、ここで苦労してはよくわからないことになりますしねw developer.github.com

続きを読む

Gitを使い始めたら一番最初にやりたい 'git config' 設定メモ

Gitで一番最初にやる設定をよく忘れるのでちょっとメモしておきます。

  • git config
  • 初期設定
    • ユーザー名とメールアドレス
    • push方式
    • pull方式
      • merge commitを作成するか
      • rebaseするか
    • デフォルトのブランチ名
    • プロキシ
    • 改行コードの自動変換
    • ファイル名の大文字と小文字を区別する
  • 使い勝手を向上する
    • 文字色
    • エディター
    • エイリアス
    • 日本語ファイル名をエンコードしない
    • 認証情報をキャッシュする
  • セキュリティを向上する
    • パスワードの登録を禁止
    • GPG署名
  • 設定内容の確認
  • 設定内容を削除する
  • ここまでの~/.gitconfig
  • 書籍
  • 参考サイト

git config

Gitの設定を行うにはgit configコマンドを利用するか、設定ファイルを直接作成&編集します。

git configコマンドを実行すると自動的に設定ファイルが作成されます。すでに設定ファイルが存在している場合には、指定した項目が上書き保存されます。設定ファイル自体も以下のようにini形式のファイルとなっており、編集自体もそれほど難しくありません。

$ cat ~/.gitconfig 
[user]
    name  = Makito Katsube
    email = katsubemakito@gmail.com
[color]
    ui = true

また設定ファイルを設置する場所、またコマンドのオプションで影響範囲が変わりますので、複数人でチーム開発する際にはGitの設定をどうやって管理するかは事前に話し合っておく必要もあります。

影響範囲 ファイル コマンド
システム全体 /etc/gitconfig git config --system (設定内容)
各ユーザー ~/.gitconfig または ~/.config/git/config git config --global (設定内容)
リポジトリ リポジトリの .git/config git config --local (設定内容)
※カレントディレクトリが各リポジトリのワーキングディレクトリである必要があります

同じ設定項目があった場合、リポジトリ内にある設定が最優先されます。

このページでは git config --global を前提としてご紹介します。

続きを読む

[Git] git rmを取り消す

git rmを無かったことにします。

コマンド

$ git reset HEAD hello.txt
$ git checkout hello.txt

実行例

git reset HEAD [ファイルのパス] でキャンセルし、続け様にgit checkout [ファイルのパス]でファイルを復活することができます 。

$ git rm hello.txt
rm 'hello.txt'

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        deleted:    hello.txt

git resetするとインデックス上から削除したという記録を消去します。この時点ではまだファイルは削除されたままですので、git checkoutでファイルを所定の場所に再配置します。

$ git reset HEAD hello.txt
Unstaged changes after reset:
D       hello.txt

$ git checkout hello.txt

参考

[Git] タグをつける

Gitでは区切りの良いバージョンに、それだとわかる目印をつけることができ、それを「タグ」と呼びます。

タグをつける

git tag [タグ名] でタグをつけることができます。以下はv1.0.1という名前のタグを作成しています。

$ git tag v1.0.1

タグが正常に作成されたかは、タグの一覧を表示し確認することができます。

$ git tag
v1.0.1

注釈付きタグ

タグをつける際には、メモ書きを同時につけることもできます。 コマンドは git tag -am "[注釈]" [タグ名] になります。

$ git tag -am "release 2016/04/01. bugfix ver" v1.0.2

注釈付きのタグの一覧を表示するにはgit tag -nと打ちます。

$ git tag -n
v1.0.2          release 2016/04/01. bugfix ver

もしこの書き方が気持ち悪い場合は git tag -a [タグ名] -m [注釈] とすることも可能です。

過去のcommitにタグをつける

git checkout [チェックサム]とした後にgit tag [タグ名]としてももちろん良いのですが、

$ git log --pretty=oneline
34dd42238d58dfcece4a1a78a4ca6145c6f38725 4th commit.
a1019b6b2460a272dba1ad0ef0f5074baafc8fa6 2nd commit.
9c45bea8ac9274aefe0e53e2ca22c42802764cc3 Initial commit.

$ git checkout a1019b6b2460a272dba1ad0ef0f5074baafc8fa6
$ git tag foobar

タグを作成する際に、チェックサムを指定することでも同じことが実現できます。

$ git tag -a foobar -m "comment" a1019b6b2460a272dba1ad0ef0f5074baafc8fa6

トラブルシューティング

pushされない

通常、普通にpushしただけではtagはリモートに送信されません。タグをpushしたい場合には --tags オプションを指定します。

$ git push --tags
Counting objects: 2, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 233 bytes | 0 bytes/s, done.
Total 2 (delta 1), reused 0 (delta 0)
To /home/katsube/Work/test.git
* [new tag]         v1.0.1 -> v1.0.1
* [new tag]         v1.0.2 -> v1.0.2
* [new tag]         v2.0.0 -> v2.0.0

これまで送信されていないタグがすべて送信されます。

参考

[Git] git addを取り消す

git addを無かったことにします。

コマンド

$ git reset foo.txt

実行例

git reset [ファイルのパス] でキャンセルすることができます。

$ git add foo.txt
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        new file:   foo.txt

git resetするとUntracked fileとなり、git addする前の状態に戻りました。

$ git reset foo.txt
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        foo.txt

なお、git reset [ファイルのパス]git reset HEAD [ファイルのパス] と同じ意味になります。

参考

[Git] 空のディレクトリを追加する

実行例

Gitはその仕様上、空のディレクトリを登録してくれません。

$ mkdir empty
$ ls
empty

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

nothing to commit, working directory clean

git addしても取り合ってくれません。

$ git add empty
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

nothing to commit, working directory clean

そこで空のディレクトリを登録するためには、何か適当なファイルを設置する必要があるのです。Git界隈では慣習として .gitkeep という名前の空ファイルを用意することが多いようですが、ファイル名は何でも良いです。

$ touch empty/.gitkeep
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        empty/

nothing added to commit but untracked files present (use "git add" to track)

ファイルを追加した時点でディレクトリではないやろというツッコミは、大人はしちゃダメですw

参考

[Git] ファイルを移動する(git mv)

コマンド

$ git mv *.txt work/

実行例

git mv [ファイルのパス] [移動後のファイルのパス] でファイルを移動できます。

$ git mv hello.txt move/

git statusで先ほどの変更した箇所が表示されれば成功です。

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        renamed:    hello.txt -> move/hello.txt

忘れずにcommitしておきましょう。

一度にまとめて移動する

Linux(UNIX)のmvと同様に、git mv [ファイル1] [ファイル2]...[ファイルn] [移動先] のように一番最後に移動後のディレクトリを指定すれば複数ファイルをまとめて移動することができます。

$ git mv *.txt move/
$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        renamed:    Hi.txt -> move/Hi.txt
        renamed:    hello.txt -> move/hello.txt
        renamed:    yahoo.txt -> move/yahoo.txt

Gitを通さないで名前を変更するとどうなる?

別のファイルとして扱われるため、それまで記録し続けてきたログがその時点で途切れてしまいます。

$ mv foobar.txt foo.txt
$ git status
HEAD detached at 4f00e3b
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        deleted:    foobar.txt

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        foo.txt

no changes added to commit (use "git add" and/or "git commit -a")

過去の経緯などを調査することが非常に面倒になりますので、必ずgitを通しましょう。

参考