githubで良い感じのpull reqがあったので手元で勝手に取り込んで使ってみる

最近Vagrantがおもしろいなーと思っていそいそと触ってます。その中で、VirtuanBoxの内部ネットワークを利用したいなと思ったのですが、今リリースされている1.0.5では対応してませんでした。ただ、それを実現するpull reqはありました。そこで、これを手元で当ててインストールして使ってみましたのでまとめ。gitのいい練習になりました。

forkしてtagを再現

とりあえず元のvagrantのレポジトリをforkしておきます。あとで出来上がったタグをpushするぐらいにしか使いませんが。。。そしたら手元でclone。

$ git clone git@github.com:riywo/vagrant.git

今回、gemでリリースされているv1.0.5に対して所望のpull reqを当てたいので、まずはv1.0.5の状態にします。

$ git checkout -b intnet_pull_req_to_1.0.5 v1.0.5
$ git branch
* intnet_pull_req_to_1.0.5
  master

pull reqのレポジトリをremoteに追加してmerge

次に、持ってきたいpull reqのレポジトリを別のremoteレポジトリとして登録します。Unisterさんのレポジトリですね。

$ git remote add Unister https://github.com/Unister/vagrant.git
$ git fetch --all
$ git branch -a
* intnet_pull_req_to_1.0.5
  master
  remotes/origin/1-0-stable
  remotes/Unister/1-0-stable
...

今回当てたいpull reqの状態はremotes/Unister/1-0-stableのHEADなので、単純にこのremoteブランチを先ほどtagを再現したブランチにmergeするだけで終わりです。

$ git merge remotes/Unister/1-0-stable

これで無事mergeコミットができたとおもいます。今回は特に衝突なくいけたのでいいですが、ものによってはここで頑張ることになるかと思います。

当てたい状態がHEADじゃなかったらどうやるのかな。。。

バージョン上げてインストールしたり

あとはこれを手元でインストールして使いたいので、バージョンを上げてrakeで入れてあげます。

$ vim lib/vagrant/version.rb
1.0.5.1に
$ git add .
$ git commit -m "v1.0.5.1"
$ git tag v1.0.5.1
$ rake install

あと、一応githubにpushしておいて後でも使える様にしておきました。これでGemfileで指定すればいつでも使えます。

$ git push --tag

$ cd MyApp
$ cat Gemfile
gem "vagrant", :git => "git://github.com/riywo/vagrant.git", :tag => "v1.0.5.1"
$ bundle install
$ bundle exec vagrant -v
Vagrant version 1.0.5.1

おわりに

git&github楽しいですね。やり方間違ってるとかがあればぜひご指摘下さいませ。

ちなみに当てたpull reqですが期待通りの動作をしてくれてます。VagrantfileとGemfileセットにしておけば、混乱なく使えそう。

DQNEO 12-12-05 (水) 2:17

こんにちは。

>remotes/Unister/1-0-stableのHEAD
ブランチのHEADという言い方は間違いですね。

Gitの定義からして、ブランチとはある特定のコミットオブジェクトを指す別名でしかないので、”remotes/Unister/1-0-stable”という名前は何らかの単一のコミットオブジェクト”指しています。

HEADは、「ワーキングツリーが指しているブランチ」のことです。
この場合、HEADは”intnet_pull_req_to_1.0.5″を指しています。
HEAD -> intnet_pull_req_to_1.0.5 -> あるコミットオブジェクト
という参照関係になります。

>当てたい状態がHEADじゃなかったらどうやるのかな。。。

ブランチの途中の状態を現在のワーキングツリーにマージしたいなら、
git merge a1b2c3d4
のように任意のコミットハッシュ値を指定すればいけると思います。

ご参考まで。