2011-04-02 16 views
5

He escrito una secuencia de comandos 'deploy' muy simple ejecutándose como mi gancho post-update dentro de mi git repo.GIT & Ruby: ¿Cómo puedo desarmar la variable GIT_DIR desde dentro de un script de ruby?

Las variables son las siguientes

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 

tanto live & stage han inicializado repositorios GIT (no desnudos) y he añadido mi repo desnudo como un control remoto para cada uno de ellos (el nombre core) para que git pull core stage o git pull core live obtendría los archivos actualizados de los respectivos branch del repositorio core.

El guión es el siguiente:

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

He intentado adaptar la 'actualización' de archivos de this bash script here que utiliza el unset GIT_DIR ejecutar el siguiente comando git git pull core stage por ejemplo. core es el remote agregado de mi repositorio bare en una carpeta diferente en el servidor.

Sin embargo cuando se ejecuta la secuencia de comandos que estoy recibiendo los errores siguientes:

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.   

¿Hay alguna manera de hacer lo mismo que unset GIT_DIR en una escritura del golpe dentro de mi script de Ruby?

Muchas gracias,

Jannis

Respuesta

6

Esto parece

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

podría hacer el trabajo.

Especular sobre por qué (especulando, ya que no estoy familiarizado con el rubí): se estaba ejecutando el comando unset en una cáscara diferente de la que se extiende la git pull (y como samold señala en su respuesta, el mismo problema sucede con el directorio de trabajo actual).

Lo que sugiere que puede haber alguna API de ruby ​​que manipule el entorno que ruby ​​pasa al shell que inicia con el operador de backtick, y también para cambiar el directorio de trabajo actual.

+0

Esto funciona como magia! Muchas gracias. ¡Lo tengo todo listo y funcionando ahora!Desactivado para saber cómo hacer lo mismo al pasar un comentario especialmente formateado a las notas de confirmación :) Me pregunto si se podría usar algo como '[update: live]' o '[update: stage]' para activar este 'pull 'acción ... – Jannis

+0

Me salvó un montón de frustración. ¡Gracias! ¡No me di cuenta de que estas variables tenían tal significado! –

4

Intente reemplazar su línea con esto:

ENV['GIT_DIR']=nil 

No estoy seguro de que su:

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

secciones funcionará incluso cuando el GIT_DIR ha sido adecuadamente desarmado; cada backticks inicia un nuevo shell, sin relación con el shell anterior, y los shells secundarios no pueden cambiar el directorio de trabajo actual de sus procesos principales.

Prueba esto:

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

¡Gracias por el consejo! Esto es igual de bueno que la respuesta de __ndim __, pero como mi guión final está usando su única cadena en formato de ticks hacia atrás, elegí aceptar su respuesta en lugar de esta. ¡Sin importar muchas gracias de nuevo! – Jannis

+1

@ Jannis, depende de tus objetivos: la respuesta de @dim es mejor si quieres desactivar 'GIT_DIR' solo para esa invocación. El mío es mejor si quieres 'GIT_DIR' desarmado para la totalidad del guión. Hacen cosas diferentes :) así que elige la que mejor se adapte a la tarea. – sarnold

+0

¡Oh, ... ahora que lo mencionas, tiene sentido! Gracias por informarme sobre esto, en este caso lo mantendré como 'desarmado'. Pero para futuras aventuras de guiones esto definitivamente será muy útil. Gracias de nuevo. – Jannis

Cuestiones relacionadas