2011-04-02 11 views
5

私は非常にシンプルな 'デプロイ'スクリプトを実行して、post-updateフックを私の裸のgitリポジトリに入れました。GITとRuby:GIT_DIR変数をRubyスクリプトの中から解除するにはどうすればよいですか?

live domain   = ~/mydomain.com 
staging domain  = ~/stage.mydomain.com 
git repo location = ~/git.mydomain.com/thisrepo.git (bare) 

core    = ~/git.mydomain.com/thisrepo.git 
core    == added remote into each live & stage gits 

次のように

変数は、両方のlive & stageは(非裸)のgitリポジトリを初期化していると私はgit pull core stageをするように(coreという名前)それらのそれぞれにリモートとしての私の裸のレポを追加しましたまたはgit pull core liveの場合、coreレポのbranchから更新されたファイルを取得します。私は、例えば、次のgitコマンドgit pull core stageを実行するためにunset GIT_DIRを使用していますthis bash script hereからのファイルの「更新」を適応しようとしている

#!/usr/bin/env ruby 

# Loop over each passed in argument 
ARGV.each do |branch| 

    # If it matches the stage then 'update' the staging files 
    if branch == "refs/heads/stage" 

    puts "" 
    puts "Looks like the staging branch was updated." 
    puts "Running a tree checkout now…" 
    puts "" 
    `cd ~/stage.mydomain.com` 
    `unset GIT_DIR` # <= breaks! 
    `git pull core stage` 
    puts "" 
    puts "Tree pull completed on staging branch." 
    puts "" 

    # If it's a live site update, update those files 
    elsif branch == "refs/heads/live" 

    puts "" 
    puts "Looks like the live branch was updated." 
    puts "Running a tree checkout now…" 
    puts "" 
    `cd ~/mydomain.com` 
    `unset GIT_DIR` # <= breaks! 
    `git pull core live` 
    puts "" 
    puts "Tree checkout completed on live branch." 
    puts "" 

    end 

end 

次のように

スクリプトです。 coreは、サーバー上の別のフォルダにというbareというRepoが追加されています。

は、しかし、私の上にスクリプトを実行するときに次のエラーを取得しています:

remote: hooks/post-update:35: command not found: unset GIT_DIR   
remote: fatal: /usr/lib/git-core/git-pull cannot be used without a working tree.   

は私のRubyスクリプト内bashスクリプトでunset GIT_DIRと同じことを行うための方法はありますか?

多くのおかげで、

Jannis

答えて

6

仕事をすることができ

`cd ~/stage.mydomain.com && unset GIT_DIR && git pull core stage` 

のようにこれが見えます。

理由(私はルビーに慣れていないよと推測)を推測:あなたは彼の答えで出git pull(およびsamoldとしてポイントを実行しているものとは別のシェルでunsetコマンドを実行していた、同じ問題現在の作業ディレクトリで発生します)。

これは、環境を操作するルビAPIがあるかもしれないことを示唆しています。これは、ルックがバックティック演算子で起動するシェルに渡し、また現在の作業ディレクトリを変更することを示しています。

+0

これは魔法のように動作します:

はこれを試してみてください!どうもありがとうございました。それはすべて今稼働している!特別な書式のコメントをコミットノートに渡すことで同じことをする方法を知るために:) '[update:live]'や '[update:stage]'のようなものがこの 'pull 'アクション... – Jannis

+0

ちょうど私に悲しみのトンを保存しました - ありがとう!これらの変数にはこのような重要性があることを認識していませんでした! –

4

は、これであなたのラインを交換してみてください:

ENV['GIT_DIR']=nil 

私はわからないあなた:

`cd ~/stage.mydomain.com` 
`unset GIT_DIR` # <= breaks! 
`git pull core stage` 

セクションGIT_DIRが正常に解除されている場合でも動作します。各backticksは古いシェルとは無関係の新しいシェルを開始し、子シェルは親プロセスの現在の作業ディレクトリを変更することができません。

​​
+0

チップをありがとう!これは__ndim __の答えと同じくらい良いですが、私の最終的なスクリプトはバックチックの書式で彼の単一の文字列を使用しているので、私はこの答えではなく彼の答えを受け入れることにしました。関係なく、多くのおかげで再び! – Jannis

+1

@Jannisは、あなたの目標に依存しています:@ ndimの答えは、その_one_呼び出しに対してのみ 'GIT_DIR'を設定しない方が良い場合です。スクリプトの全体に対して 'GIT_DIR'を設定したくない方が良いです。彼らは別のことをする:)そのどちらかが良い仕事に合うものを選んでください。 – sarnold

+0

ああ、今言いました、それは完全な意味があります!私にこのことを知らせてくれてありがとう、このイ​​ンスタンスでは私は 'unset .. 'としますが、将来のスクリプティングアドベンチャーのためには、これは間違いなく非常に便利です。再度、感謝します。 – Jannis