在post-receive hook中重用GIT_WORK_TREE到几个文件

时间:2011-07-09 13:29:20

标签: git git-checkout bash

我使用这个'教程'来设置DSP环境:http://toroid.org/ams/git-website-howto(是的,我没有T)。

我的工作流程非常简单:

  1. 在本地开发( D
  2. 提交一些事情
  3. 承诺更多事情
  4. 推送到舞台(和Github)( S
  5. 在分段上测试新代码
  6. 推送到生产( P
  7. 我的代码包含由我的代码缩小的CSS文件,然后保存到1个文件:all.css。在本地,我已关闭该选项,因此每次更改CSS时我都不必手动删除all.css。在Staging和Production上,他们应该尽快缓存(因此从单独的CSS文件创建all.css)。

    问题在于每次推送时,我都必须删除all.css(以及all.js - 完全相同的故事)以查看更改(并正确测试)。

    在本教程中,我创建了一个post-receive钩子,将更改检出到某个文件夹(Apache读取代码的位置)。

    我当前的post-receive挂钩:

    #!/bin/sh
    GIT_WORK_TREE=/var/www/www.example.org git checkout -f
    

    我想重复使用$GIT_WORK_TREE删除$GIT_WORK_TREE中的两个文件(www/all.csswww/all.js),但我不能......没有var $ GIT_WORK_TREE在下一行。

    所以我把它改成了这个,但我不喜欢这样,特别是如果我想在未来用它做更多的事情:

    #!/bin/sh
    GIT_WORK_TREE=/var/www/www.example.org git checkout -f
    rm /var/www/www.example.org/www/all.css
    rm /var/www/www.example.org/www/all.js
    

    $GIT_WORK_TREE不会像这样重复使用。

    我尝试过的不起作用的事情:

    GIT_WORK_TREE=/var/www/www.example.org git checkout -f
    rm $GIT_WORK_TREE/www/all.css
    rm $GIT_WORK_TREE/www/all.js
    
      

    rm:文件不存在等(/www/all.css)($GIT_WORK_TREE为空)

    GIT_WORK_TREE=/var/www/www.example.org
    git checkout -f
    
      

    致命:此操作必须在工作树中运行

    GIT_WORK_TREE=/var/www/www.example.org
    cd $GIT_WORK_TREE
    git checkout -f
    
      

    致命:不在git存储库(或任何.....)

    我想我的问题与Bash的工作原理一样多,就像GIT的工作原理一样=)

3 个答案:

答案 0 :(得分:27)

目前你正在尝试一些问题。也许最好解释一下你依次尝试的每个例子的错误:

GIT_WORK_TREE=/var/www/www.example.org git checkout -f
rm $GIT_WORK_TREE/www/all.css
rm $GIT_WORK_TREE/www/all.js

这里的问题是,如果在命令之前直接定义变量,则环境变量仅在您正在运行的命令的环境中设置 - 它不在当前shell中设置。你可以轻松地测试一下:

$ FOO=bar sh -c 'echo $FOO'            
bar
$ echo $FOO

$ 

你的下一次尝试是:

GIT_WORK_TREE=/var/www/www.example.org
git checkout -f

在这种情况下,为了在您在脚本中调用的其他命令的环境中设置变量,您需要将其导出,例如使用export GIT_WORK_TREE=/var/www/www.example.org而不是第一行。

你的最后一次尝试是:

GIT_WORK_TREE=/var/www/www.example.org
cd $GIT_WORK_TREE
git checkout -f

这与您之前的尝试存在同样的问题(即您需要导出GIT_WORK_TREE),但它也有一个更微妙的问题。正如我在this blog post中所描述的那样,GIT_DIR.脚本的环境中设置为post-receive(即当前目录)。因此,如果将目录更改为工作树的顶部,GIT_DIR将指向该目录,而不是.git目录!一些好的经验法则是(a)你应该只将GIT_DIRGIT_WORK_TREE放在一起,(b)如果你设置它们,你应该将它们都设置为绝对路径。所以,我认为以下钩子将适用于您的情况:

#!/bin/sh
export GIT_WORK_TREE=/var/www/www.example.org
export GIT_DIR=/var/www/www.example.org/.git
cd $GIT_WORK_TREE
git checkout -f
rm www/all.css
rm www/all.js

答案 1 :(得分:7)

为什么不在路径中使用变量?

#!/bin/sh
work_tree=/var/www/www.example.org
GIT_WORK_TREE=$work_tree git checkout -f
rm $work_tree/www/all.css
rm $work_tree/www/all.js

然后你不需要导出。 这对我来说非常适合。

答案 2 :(得分:1)

GIT_WORK_TREE=....
export GIT_WORK_TREE
git ...
rm $GIT_WORK_TREE/...

应该工作并且是最安全的(你并不总是需要导出你的环境变量,但通常它不会造成伤害:))