我使用这个'教程'来设置DSP环境:http://toroid.org/ams/git-website-howto(是的,我没有T)。
我的工作流程非常简单:
我的代码包含由我的代码缩小的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.css
和www/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的工作原理一样=)
答案 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_DIR
和GIT_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/...
应该工作并且是最安全的(你并不总是需要导出你的环境变量,但通常它不会造成伤害:))