4

RVMを使用しています。プロジェクトの Gitpre-commitフックを作成しました。

#!/usr/bin/env ruby

puts RUBY_VERSION
puts `echo $PATH`
exit(1)

Git で実行すると、次のように出力されます。

$ git ci -m 'foo'
1.8.7
/usr/libexec/git-core:/usr/bin:/usr/local/heroku/bin:/Users/mgoerlich/.rvm/gems/ruby-2.0.0-p195@global/bin:/Users/mgoerlich/.rvm/rubies/ruby-2.0.0-p195/bin:/Users/mgoerlich/.rvm/bin:/Users/mgoerlich/adt-bundle-mac-x86_64-20130219/sdk/platform-tools:/Users/mgoerlich/adt-bundle-mac-x86_64-20130219/sdk/tools:/usr/local/bin:/usr/local/sbin:/Users/mgoerlich/.dotfiles/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/bin/core_perl:/Users/mgoerlich/bin:/usr/local/share/npm/bin:/usr/local/share/npm/bin

$PATHbash や zsh や sh と同じではないため、間違ったバージョンの Ruby で実行されているようです。git が操作しているようです$PATH。手動で実行すると、次のようになります。

$ .git/hooks/pre-commit
2.0.0
/usr/local/heroku/bin:/Users/mgoerlich/.rvm/gems/ruby-2.0.0-p195@global/bin:/Users/mgoerlich/.rvm/rubies/ruby-2.0.0-p195/bin:/Users/mgoerlich/.rvm/bin:/Users/mgoerlich/adt-bundle-mac-x86_64-20130219/sdk/platform-tools:/Users/mgoerlich/adt-bundle-mac-x86_64-20130219/sdk/tools:/usr/local/bin:/usr/local/sbin:/Users/mgoerlich/.dotfiles/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/bin/core_perl:/Users/mgoerlich/bin:/usr/local/share/npm/bin:/usr/local/share/npm/bin

commit フックの出力には、先頭に追加された 2 つのパスがあり、そのうちの 1 つは/usr/binシステム Ruby の実行可能ファイルが置かれている場所です。

これは既知の動作ですか? 何とかそれを操作できますか?シバンで正しいRubyバージョンへのフルパスを指定できることは知っていますが、これは私が望むものではありません。

4

3 に答える 3

4

ruby または rvm ラッパーへの固定パスの代わりに使用したくなかった理由envは、これはチーム プロジェクト用であり、チームの全員が RVM を使用しているわけではないためです。

私の最終的な解決策は、独自のラッパー スクリプトを作成し、そのプロジェクトに追加することでした。

すべてのクライアント側の git フックは ' に$PROJECT/bin/hooksあり、それらはすべて ruby​​ スクリプトです。$PROJECT/.git/hooksここで、前述のラッパーをそこに配置し、すべてのフックに対してそのラッパーへのシンボリックリンクを作成しました。

スクリプトは RVM が使用されているかどうかをチェックし、使用されている場合は$PATHvar を修正し、プロジェクト ルートに.ruby-versionand/or.ruby-gemsetファイルがある場合は、それに応じたバージョン/gemset をロードします。

その後、適切な Ruby スクリプトが実行されます。興味がある場合は、ラッパーを次に示します。

#!/bin/bash
if [ -d "$HOME/.rvm/bin" ]; then
  PATH="$HOME/.rvm/bin:$PATH"
  [[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"

  if [ -f ".ruby-version" ]; then
    rvm use "$(cat .ruby-version)"
  fi

  if [ -f ".ruby-gemset" ]; then
    rvm gemset use "$(cat .ruby-gemset)"
  fi
fi
ruby "bin/hooks/$(basename "$0").rb"

それで、私は自分の rvm バージョン/gemset を取得し、他の全員が PATH にある ruby​​ バージョンを取得し、全員が満足しています。

于 2013-07-09T09:37:37.020 に答える
0

私がやったことは次のとおりです:.gitファイル構造:

  • .git/hooks/pre-commit
  • .git/hooks/pre-commit-main.rb

.git/hooks/pre-commit:

#!/usr/bin/env bash
export PATH="$THE_GOOD_PATH"
ruby "$GIT_DIR/hooks/pre-commit-main.rb"

.git/hooks/pre-commit-main.rb:

#!/usr/bin/env ruby
puts RUBY_VERSION

次に、 を呼び出すときは、 が定義されgit commitていることを確認してください。THE_GOOD_PATH

export THE_GOOD_PATH="$PATH"
git commit

アプリケーションのトップレベルからエクスポートTHE_GOOD_PATH="$PATH"して、.profileすべてのフックを 1 つのファイルにシンボリック リンクすることもできます。

この方法には、rbenv に依存しないという利点があります。RVM または Python の virtualenv でも機能します。

私は Git 開発者 ( http://permalink.gmane.org/gmane.comp.version-control.git/258454 ) に手紙を書き、放っておいてくれるように頼みましたPATHが、最初の返事は WONTFIX でした。

于 2014-10-18T17:38:03.267 に答える