ruby - 为什么我的 Ruby Git 脚本 Hook 使用错误的 $PATH 运行?

标签 ruby git rvm environment-variables

我正在使用 RVM。我为一个项目写了一个 Git pre-commit 钩子(Hook):

#!/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

它似乎与错误版本的 Ruby 一起运行,因为 $PATH 与 bash 或 zsh 或 sh 中的不同。看起来 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 hook的输出中,有两个路径在前面,其中一个是/usr/bin,其中放置了系统Ruby的可执行文件。

这是已知行为吗?我能以某种方式操纵它吗?我知道我可以在 shebang 中指定正确 Ruby 版本的完整路径,但这不是我想要的。

最佳答案

我不想使用 env 而不是固定路径到 ruby​​ 或 rvm 包装器的原因是这是针对团队项目的,并不是团队中的每个人都在使用 RVM。

我的最终解决方案是编写自己的包装器脚本并将其添加到该项目。

所有客户端 git 钩子(Hook)都存在于 $PROJECT/bin/hooks 中,它们都是 ruby​​ 脚本。 现在,我刚刚将提到的包装器放在那里,并在 $PROJECT/.git/hooks 中为所有 Hook 创建了指向该包装器的符号链接(symbolic link)。

脚本检查是否使用了 RVM,如果是,则修复 $PATH var 以及是否有 .ruby-version 和/或 .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​​ 版本,每个人都很高兴。

关于ruby - 为什么我的 Ruby Git 脚本 Hook 使用错误的 $PATH 运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17515769/

相关文章:

mysql - Ruby MySQL 输出在不同服务器上发生冲突

mysql - Ruby mysql2 单个查询中的多个语句

ruby-on-rails - 在 Rails 中使用 datetimepicker 重定向到日期选择的另一个页面?

ruby - SAP 新实现Ruby 对Ruby 程序员有何意义?

git - 存储/分支/工作副本困惑

Ruby 版本管理器破坏了我的 $PATH

ruby - 无法安装 ruby​​ 2.0.0

git - 使用Git从 "Repo"仓库同步一个项目

git - BitBucket.org - 仅限制用户数量?

bash - 如何在 shell 脚本中使用 rvm