2011-04-02 10 views
5

Ho scritto uno script 'deploy' molto semplice eseguito come il mio hook post-update all'interno del mio repository git nudo.GIT & Ruby: Come posso rimuovere la variabile GIT_DIR da uno script ruby?

Le variabili sono i seguenti

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 

sia live & stage hanno inizializzato repos git (non nudo) e ho aggiunto il mio repo nuda come un telecomando per ciascuno di essi (di nome core) in modo che git pull core stage oppure git pull core live estrarre i file aggiornati dal rispettivo branch del repository core.

Lo script è il seguente:

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

Ho provato adattare il 'aggiornamento' di file da this bash script here che usa il unset GIT_DIR per eseguire il prossimo comando git git pull core stage per esempio. core è il remote aggiunto del mio repository bare in una cartella diversa sul server.

Tuttavia quando si esegue lo script precedente sto ottenendo i seguenti errori:

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.   

Esiste un modo per fare la stessa cosa di unset GIT_DIR in uno script bash nel mio script Ruby?

Molte grazie,

Jannis

risposta

6

Questo appare come

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

potrebbe fare il lavoro.

Speculare sul perché (speculando come non ho familiarità con Ruby): si stesse eseguendo il comando unset in un guscio di diverso da quello che gestisce le git pull (e come samold punti nella sua risposta, lo stesso problema succede con la directory di lavoro corrente).

Il che suggerisce che potrebbe esserci qualche API ruby ​​che manipola l'ambiente che ruby ​​passa alla shell che avvia con l'operatore backtick e anche a cambiare la directory di lavoro corrente.

+0

Questo funziona come per magia! Grazie mille. Ho tutto pronto e funzionante ora!Off per scoprire come fare lo stesso passando in un commento appositamente formattato nelle note di commit :) Mi chiedo se qualcosa come '[update: live]' o '[update: stage]' possa essere usato per attivare questo 'pull 'azione ... – Jannis

+0

Mi hai appena salvato un sacco di frustrazione - Grazie! Non sapevo che queste variabili avevano un tale significato! –

4

Provare a sostituire la vostra linea con questo:

ENV['GIT_DIR']=nil 

non sono sicuro il vostro:

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

sezioni funzionano anche quando il GIT_DIR è stata correttamente impostata; ogni backtick avvia una nuova shell, non correlata alla vecchia shell, e le shell figlio non possono cambiare la directory di lavoro corrente dei loro processi genitore.

Prova questa:

ENV["GIT_DIR"]=nil 
`cd ~/stage.mydomain.com ; git pull core stage` 
+0

Grazie per il suggerimento! Questo è ugualmente buono come la risposta di __ndim __ ma perché il mio script finale sta usando la sua singola stringa nella formattazione dei tick posteriori, ho scelto di accettare la sua risposta invece di questa. A prescindere molte grazie ancora! – Jannis

+1

@Jannis, dipende dai tuoi obiettivi: la risposta di @ ndim è migliore se vuoi disinserire 'GIT_DIR' solo per quella invocazione _one_. Il mio è meglio se vuoi 'GIT_DIR' unset per la totalità dello script. Fanno cose diverse :) quindi scegli quello che meglio si adatta al compito. – sarnold

+0

Oh, .. ora che ne parli, questo ha perfettamente senso! Grazie per avermelo fatto sapere, in questo caso lo terrò come "unset .." ma per future avventure scripting questo sarà sicuramente molto utile. Grazie ancora. – Jannis