我正在使用 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/