octopress で使う ruby を 1.9.3-p448 から 2.0.0-p247 にあげようと思って、 そのついでに octopress 自体も master の最新のものに更新したので、 その手順のメモです。

その時に .ruby-version が conflict したので、 その話がメインです。

.ruby-version とは?

rbenv が .rbenv-version から .ruby-version に変わった時には 知らなかったのですが、 A Common .ruby-version File For Ruby Projects というものがあって、 rbenv や rvm のような切り替えツール共通で .ruby-version というファイルを使おうということのようです。

octopress の .ruby-version

その発想は良いのですが、 rbenv + ruby-build だと 1.9.3-p448 や 2.0.0-p247 のように パッチレベルまで .rbenv-version に入るのが普通なのに rvm が作る .ruby-version だと 1.9.3 のように パッチレベルが入らないようで、 octopress の .ruby-version で問題が起きました。

元々使い始めた時の octopress の master には .ruby-version ファイルが入っていて、 1.9.3 という内容でした。

手元での回避策としては、 ln -snf 1.9.3-p448 ~/.rbenv/versions/1.9.3 のようにシンボリックリンクで回避するとか、 configure--prefix=$HOME/.rbenv/versions/1.9.3 で 別途インストールするとかも考えたのですが、 他に影響が出るのが嫌だったので、 結局 .ruby-version を書き換えて使うことにしました。

rbenv を使っていて、 リリースされているバージョンの ruby のインストールには ruby-build を使っていて 1.9.3-p448 にする必要があったので、 rbenv local 1.9.3-p448 で置き換えました。

バージョンアップ手順

まず remote を確認します。

 git remote -v
octopress       git://github.com/imathis/octopress.git (fetch)
octopress       git://github.com/imathis/octopress.git (push)
origin  git@github.com:znz/znz.github.io (fetch)
origin  git@github.com:znz/znz.github.io (push)

octopress という名前にしていることが確認出来たので、 fetch します。

% git fetch octopress
remote: Counting objects: 85, done.
remote: Compressing objects: 100% (34/34), done.
remote: Total 46 (delta 30), reused 26 (delta 10)
Unpacking objects: 100% (46/46), done.
From git://github.com/imathis/octopress
   9699df7..5a6b8e4  2.5        -> octopress/2.5
   f75547f..ff71657  master     -> octopress/master
   8d7ef9a..98bd6c9  site-2.1   -> octopress/site-2.1

merge する前に git diff source...octopress/master で変更点を確認してから merge します。

% git diff source...octopress/master
% git merge octopress/master
Auto-merging Rakefile
CONFLICT (modify/delete): .ruby-version deleted in octopress/master and modified in HEAD. Version HEAD of .ruby-version left in tree.
Automatic merge failed; fix conflicts and then commit the result.
zsh: exit 1     git merge octopress/master

conflict しました。 .ruby-version は消してしまって rbenv global 2.0.0-p247 で設定している 2.0.0-p247 を使う予定なので、 消してしまいます。 その変更を commit すると merge 完了でした。

% git rm .ruby-version
.ruby-version: needs merge
rm '.ruby-version'
% git commit -av
[source 136b37f] Merge remote-tracking branch 'octopress/master' into source

うまくいったので、バックアップをかねて github に push しておきます。

% git push
Counting objects: 55, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (39/39), done.
Writing objects: 100% (41/41), 4.90 KiB | 0 bytes/s, done.
Total 41 (delta 28), reused 0 (delta 0)
To git@github.com:znz/znz.github.io
   5dabdd2..136b37f  source -> source

rake のバージョンの関係で rake preview などではなく bundle exec rake preview のように実行することが必須になってしまいました。

% rake preview
rake aborted!
You have already activated rake 10.1.0, but your Gemfile requires rake 0.9.2.2. Using bundle exec may solve this.

まとめ

事前に予測できた範囲の conflict しかなくて、 簡単に解決できました。

.ruby-version.gitignore には入っていないので、 余計な conflict を避けるために .gitignore を変更せずに使いたいのなら、 親ディレクトリに .ruby-version を用意してバージョンを指定するのが良いと思います。 .git などと同じように .ruby-version もディレクトリを上がっていって最初に見つかったものが使われるので、 そういう運用が可能です。

Disqus Comments

Kazuhiro NISHIYAMA

Ruby のコミッターとかやってます。 フルスタックエンジニア(って何?)かもしれません。 About znzに主なアカウントをまとめました。

znz znz


Published