初めに
GitLab 5.0 Release, Standing on Its Own Two Feet
先日、GitHubのOSSクローンであるGitLabが、4.2から5.0にメジャーバージョンアップ。 大きな変更としては、リポジトリ管理にGitoliteではなくGitLab-Shellを使用するようになったこと。
公式の手順に沿って5.0にしたところ、リポジトリにpushする時にエラーが発生するようになったので、調査したことと問題の解決方法をメモっておこうと思います。
環境
- CentOS 5.6
- GitLab 4.2(アップデート前)
アップデート方法
From 4.2 to 5.0 gitlabhq/gitlabhq Wiki
上記手順の通りにアップデートを実施。特に問題は出ずに、5.0にアップデートしたことをブラウザから確認できた。
エラー内容
エラーが発生したのは、GitLabで管理しているリポジトリにpushを行ったタイミング。エラー内容は以下の通り。
$ git push Counting objects: 5, done. Compressing objects: 100% (2/2), done. Writing objects: 100% (3/3), 277 bytes, done. Total 3 (delta 1), reused 0 (delta 0) remote: hooks/update:10: undefined method `require_relative' for main:Object (NoMethodError) remote: error: hook declined to update refs/heads/XXX_branch To git@localhost:XXX_repository.git ! [remote rejected] XXX_branch -> XXX_branch (hook declined) error: failed to push some refs to 'git@localhost:XXX_repository.git'
require_relativeメソッドが見つからなくて怒られている……。
調査
require_relativeとはなんぞや
Rubyist Magazine - Ruby 1.9.2 予告編
ruby1.9.2からcoreに追加されたメソッドらしく、処理内容は相対パスでライブラリを読み込むとのこと。
Rubyのバージョン確認した
なるほど、これはrubyのバージョンが古いのではないかと思い確認。
$ ruby -v ruby 1.9.3p327 (2012-11-10 revision 37606) [i686-linux]
問題なし!
push以外でエラーを発生させてみる
push以外でもエラーが出るのか気になったので、ブラウザからファイルを編集してcommitしてみたところ、下記のエラーが発生。
March 26, 2013 18:45 -> ERROR -> Command failed [1]: /usr/bin/git --git-dir=/home/git/gitlab-satellites/XXX_repository/.git push origin XXX_branch remote: /usr/local/lib/ruby/gems/1.9.1/gems/bundler-1.2.3/lib/bundler/shared_helpers.rb:2:in `require': no such file to load -- rubygems (LoadError)[K remote: from /usr/local/lib/ruby/gems/1.9.1/gems/bundler-1.2.3/lib/bundler/shared_helpers.rb:2[K remote: from /usr/local/lib/ruby/gems/1.9.1/gems/bundler-1.2.3/lib/bundler/setup.rb:1:in `require'[K remote: from /usr/local/lib/ruby/gems/1.9.1/gems/bundler-1.2.3/lib/bundler/setup.rb:1[K remote: error: hook declined to update refs/heads/XXX_branch[K To /home/git/repositories/XXX_repository.git ! [remote rejected] XXX_branch -> XXX_branch (hook declined) error: failed to push some refs to '/home/git/repositories/XXX_repository.git'
push時と異なるエラー……rubygemsがない?
gemの確認
$ gem -v 1.8.23
あった。
複数のrubyが入っていることを疑う
ruby on rails - no such file to load -- rubygems (LoadError) - Stack Overflow
「no such file to load -- rubygems」というキーワードで検索していると上記のQAを発見した。Railsで同じような問題が発生したらしい。
Eimantas氏の回答によると、複数のrubyが入っているとrubygemsのエラーが発生するらしいので、藁にもすがる思いで確認した。
rubyの配置場所を全て表示
$ which ruby /usr/local/bin/ruby $ which -a ruby /usr/local/bin/ruby /usr/bin/ruby
複数のrubyが入ってる!!
$ /usr/bin/ruby -v ruby 1.8.5
古い!!!!
対処
古いrubyを削除
どうやら古いrubyはyum経由でインストールしたものらしい。まったく誰だよインストールしたのはと思いながら、下記コマンドで古いrubyを削除。(後にインストールしたのは自分だと発覚)
$ sudo yum remove ruby
再挑戦
再度pushを試してみる。
$ git push Counting objects: 5, done. Compressing objects: 100% (2/2), done. Writing objects: 100% (3/3), 277 bytes, done. Total 3 (delta 1), reused 0 (delta 0) To git@localhost:XXX_repository.git 2ae45af..e77fe86 XXX_branch -> XXX_branch
来たー!成功!Eimantasさんありがとう!
まとめ
環境をリセットせず使いまわすと痛い目を見る良い例ですね。同様の問題で困っている人の役に立てられれば幸いです。