詩と創作・思索のひろば

ドキドキギュンギュンダイアリーです!!!

Fork me on GitHub

#github tips: hub pull-request の向き先がリポジトリのデフォルトブランチにならないとき

引数なしの hub pull-request を実行すると、リポジトリのデフォルトブランチに向けたプルリクエストを作ってくれます。このデフォルトブランチはふつう master を向いてますが、変更可能なので Git Flow で言う develop 的なブランチをデフォルトブランチにしているプロジェクトもあると思います。

さて、このデフォルトブランチをプロジェクトの歴史の中のどこかの時点で変えると、新しく clone したリポジトリで hub pull-request すると当然 develop に向けてプルリクエストを作りますが、デフォルトブランチの変更以前にこのリポジトリを clone していたリポジトリで hub pull-request すると master に向けたプルリクエストを作ろうとしてしまいます。-b develop すれば develop を向くのだけど、これは事故の元……。

原因

hub pull-request-b {base} が与えられなかったとき refs/remotes/origin/HEAD という ref (GitHub のデフォルトブランチはこれに対応しています)を参照し、これが向いている先をデフォルトブランチとみなして、そのブランチに向けたプルリクエストを作成します。この origin/HEAD という symbolic ref は git clone 時に作成されるのですが、それ以外のタイミングでは更新されることがない。そのため、途中からデフォルトブランチを変更しても古いリポジトリでは追従できないわけです。

対策

以下のコマンドを実行する。

% git remote set-head --auto origin
origin/HEAD set to develop

リモートの Git リポジトリの HEAD を、手元に反映させます。めでたし。手元の HEAD がどうなっているかは、以下のコマンドで確認できます。

% git symbolic-ref refs/remotes/origin/HEAD

GitHub実践入門 ~Pull Requestによる開発の変革 (WEB+DB PRESS plus)

GitHub実践入門 ~Pull Requestによる開発の変革 (WEB+DB PRESS plus)

YAPC::Asia 2014 で「Git によるツール開発」というタイトルで話しました #yapcasia

Git を使ったツール開発 - YAPC::Asia Tokyo 2014

YAPC::Asia 2014: Writing tools with Git // Speaker Deck

後半駆け足になりましたが、Git のサブコマンドを活用して Git のツールを作る話をしました。自分がこれまでツールを作ってきた上で、Git とのやりとりを行うにはどういった方法を取ればいいのか調べてきた話を盛り込んでます。お越しになったみなさま、ありがとうございました。

トークにそなえて Git のドキュメントやソースを読んでいたら、またいろいろと発見があって楽しかった。Git の話しましょう。

ghq v0.5-pre1 をリリースしました(`ghq import` が変わります)

https://github.com/motemen/ghq/releases/tag/v0.5-pre1

ようやく重い腰をあげ、ghq に、懸案であった ghq import への変更をいれました。

このバージョンでは以下の非互換なものを含む変更が入ります:

  • ghq import はサブコマンドを取らず、標準入力から URL のリストを受け取り、それぞれに ghq get を行うコマンドになります。
    • それに伴い、ghq import starred および ghq import pocket は廃止されます。
    • 副次的な効果として、Mercurial がインストールされていなくても go get で ghq をインストールすることができます。(わらい)
  • リリースにより配布されるコンパイル済バイナリが環境によりうまく動かなかった問題が修正されます。

そもそもこんな変更でいいのか、など特に反応がなければこれをバージョン 0.5 としてドキュメントを整備してリリースしたいと思います。

ghq import starredghq import pocket を使っていたみなさまにおかれましては、以下のような代替策を用意してあります。

GitHub でスターをつけたリポジトリをクローンする

github-list-starred を使います。

% go get github.com/motemen/github-list-starred
% github-list-starred motemen | ghq import

Pocket に追加した GitHub のリポジトリをクローンする

go-pocket を使います。

% ghq get https://github.com/motemen/go-pocket
% ghq look motemen/go-pocket

% go install -ldflags "-X main.consumerKey '<YOUR_POCKET_CONSUMER_KEY>'" ./cmd/pocket
% cp pocket 
% exit

% pocket list --domain=github.com | ghq import

go-pocket は現在鋭意開発中なのでもうちょっといい感じになる予定です(物理的な理由で push できてない)。


そのほかご意見ご感想などお気軽に Issue によろしくお願いいたします。エゴサーチが壊滅してるので……

はてなで一緒に働きませんか?