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
    のように任意のコミットハッシュ値を指定すればいけると思います。

    ご参考まで。