2013-07-07 41 views
4

我正在使用RVM。我寫了一個Git pre-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/[email protected]/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/[email protected]/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的可執行文件放在他們/usr/bin之一。

這是一個已知的行爲?我能操縱那個嗎?我知道我可以在shebang中指定正確的Ruby版本的完整路徑,但這不是我想要的。

+0

[$ PATH擴展名爲.bashrc在git鉤子腳本中不可用]的可能重複(http://stackoverflow.com/questions/9405693/path-extended-at-bashrc-not-available-within-git-hook -script) –

+0

相同的Python的virtualenv:http://stackoverflow.com/questions/9037284/how-can-i-run-a-virtualenv-python-script-as-a-git-pre-commit-hook –

+0

相同對於rbenv:https://github.com/sstephenson/rbenv/issues/374 –

回答

3

的原因,我沒有想用env,而不是一個固定的路徑,紅寶石或RVM包裝是,這是一個團隊項目,並在團隊不是每個人都使用RVM。

我最終的解決方案是寫我自己的包裝腳本並將其添加到該項目。

所有客戶端git掛鉤重新生活在$PROJECT/bin/hooks,他們都是ruby腳本。 現在,我只是把那個提到的包裝器放在那裏,並且爲所有鉤子在$PROJECT/.git/hooks中爲該包裝器創建了一個符號鏈接。

腳本檢查的,如果RVM被使用,如果是固定$PATH var和是否有.ruby-version和/或.ruby-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版/寶石和其他人一樣,他們對Ruby版本在他們的PATH中,每個人都是幸福的。

0

你需要紅寶石設置爲一個包裝:

#!$rvm_path/wrappers/ruby-2.0.0-p195/ruby 

你可以用別名簡化:

rvm alias create git_hooks 2.0.0-p195 

然後是NE家當看起來就像這樣:

#!$rvm_path/wrappers/git_hooks/ruby 

在文件中,只需確保將$rvm_path替換爲/Users/mgoerlich/.rvm,最後我牛逼的樣子:

#!/Users/mgoerlich/.rvm/wrappers/git_hooks/ruby 
+0

所以,我不能使用'/ usr/bin/env'? –

+0

有rvm-shell但它仍然不會在PATH中掛鉤 – mpapis

0

我落得這樣做是:.git文件結構:

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

的.git /掛鉤/預提交:

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

你也可以從你的.profile或您的應用程序和符號鏈接的頂層所有掛鉤出口THE_GOOD_PATH="$PATH"到單個文件。

該方法具有rbenv不可知的優點:它也適用於RVM或Python virtualenv。

我寫信給Git開發人員:http://permalink.gmane.org/gmane.comp.version-control.git/258454要求他們單獨離開我們的PATH,但最初的回覆是WONTFIX。

相關問題