我写了一个非常简单的'deploy'脚本,在我的裸git仓库中作为我的post-update
钩子运行。
变量如下
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 repos(非裸)并且我已将我的裸仓库作为远程添加到每个仓库(名为core
),以便git pull core stage
或git pull core live
从branch
repo。
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
我尝试调整this bash script here中文件的“更新”,例如使用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.
有没有办法在我的ruby脚本中的bash脚本中执行与unset GIT_DIR
相同的操作?
非常感谢,
Jannis
答案 0 :(得分:6)
这看起来像
`cd ~/stage.mydomain.com && unset GIT_DIR && git pull core stage`
可以胜任这项工作。
猜测为什么(推测我不熟悉ruby):你在运行unset
的一个不同的shell中运行git pull
命令(和 samold < / strong>在他的回答中指出,当前工作目录也会出现同样的问题。)
这表明可能有一些ruby API操纵环境ruby传递给它使用反引号运算符启动的shell,并且还可以更改当前的工作目录。
答案 1 :(得分:5)
尝试用此替换你的行:
ENV['GIT_DIR']=nil
我不确定你的:
`cd ~/stage.mydomain.com`
`unset GIT_DIR` # <= breaks!
`git pull core stage`
即使GIT_DIR
未正确设置,部分也会有用;每个反引号都会启动一个与旧shell无关的新shell,子shell无法更改其父进程的当前工作目录。
试试这个:
ENV["GIT_DIR"]=nil
`cd ~/stage.mydomain.com ; git pull core stage`