GIT & Ruby: Как я могу сбросить переменную GIT_DIR из сценария ruby? - PullRequest
5 голосов
/ 03 апреля 2011

Я написал очень простой скрипт 'deploy', работающий как мой post-update хук внутри моего чистого репозитория git.

Переменные выглядят следующим образом

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 (не голые), и я добавил свое голое репо в качестве удаленного к каждому из них (с именем core), чтобы git pull core stage или git pull core live извлекали обновленные файлы изсоответствующий branch репо core.

Сценарий выглядит следующим образом:

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

Я попытался адаптировать «обновление» файлов из этого сценария bash здесь, который использует unset GIT_DIR для запуска следующей команды git git pull core stage, например.core - это добавленное remote моего bare репо в другой папке на сервере.

Однако при выполнении приведенного выше сценария появляются следующие ошибки:

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.        

Есть ли способ сделать то же самое, что и unset GIT_DIR в скрипте bash в моем скрипте ruby?

Большое спасибо,

Яннис

Ответы [ 2 ]

6 голосов
/ 03 апреля 2011

Похоже,

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

может справиться с работой.

Предположим, почему (предположим, что я не знаком с ruby): вы запускали команду unset в другой оболочке, отличной от той, которая запускает git pull (и как samold указывает в своем ответе, такая же проблема возникает с текущим рабочим каталогом.)

Что предполагает наличие некоторого ruby ​​API, который манипулирует передачей ruby ​​среды в оболочку, которую он запускает с помощью оператора backtick, итакже изменить текущий рабочий каталог.

5 голосов
/ 03 апреля 2011

Попробуйте заменить вашу строку следующим образом:

ENV['GIT_DIR']=nil

Я не уверен, что ваши секции:

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

будут работать, даже если GIT_DIR был правильно отключен;каждый бэкстик запускает новую оболочку, не связанную со старой оболочкой, и дочерние оболочки не могут изменить текущий рабочий каталог своих родительских процессов.

Попробуйте это:

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