GithubのGo言語プロジェクトにPull Requestを送るときのimport問題

by Taichi Nakashima,

TL;DR

fork元(オリジナル)をgo getしてその中で作業,forkした自分のレポジトリにpushしてPull Requestを送る.

問題

Github上のGo言語のプロジェクトにコミットするとき,cloneの仕方で若干ハマることがある.普通のOSSプロジェクトの場合は,forkしてそれをcloneしてpush,Pull Requestとすればよい.Go言語のプロジェクトでは,同じレポジトリの中でパッケージを分け,それをimportして使ってるものがある.そういう場合にforkしたものをそのままcloneすると,importの参照先がfork元の名前になりハマる.

例えば,github.com/someone/toolがあるとする.このレポジトリはgithub.com/someone/tool/utilsという別パッケージを持っており,mainがそれを使っているとする.つまり以下のようになっているとする.

package main

import (
    "github.com/someone/tool/utils"
)

...

この場合に,通常のやりかたでforkしてソースを取得する.

$ go get -d github.com/you/tool/...

するとソースは,$GOPATH/src/github.com/youに,importしてるutilsパッケージは$GOPATH/src/github.com/someone/tool/utilsにあるといったことがおこる.で,$GOPATH/src/github.com/you/utils直しても反映されない,import書き換えないと!とかなる.

良さげなやりかた

@mopemopeさんが言及していたり,“GitHub and Go: forking, pull requests, and go-getting”に書かれているやり方が今のところ良さそう.

まず,fork元(オリジナル)のソースを取得する.

$ go get -d github.com/someone/tool/...

作業は,$GOPATH/src/github.com/someone/tool内でブランチを切って行う.

pushはforkした自分のレポジトリにする.

$ git remote add fork https://github.com/you/tool.git
$ git push fork 

あとは,そこからPull Requestを送る.

他のやりかた

forkして以下のようにcloneするというやり方も見かけた.

$ git clone https://github.com/you/tool.git $GOPATH/src/github.com/someone/tool

他にベストなやり方があれば教えてほしい.