11

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

我的工作流程非常简单:

  1. 本地开发(D
  2. 提交一些事情
  3. 提交更多的东西
  4. 推送到暂存(和 Github)(S
  5. 在 Staging 上测试新代码
  6. 推送到生产 ( P )

我的代码包含由我的代码缩小然后保存到 1 个文件的 CSS 文件:all.css. 在本地,我已经关闭了该选项,因此我不必all.css每次更改 CSS 时都手动删除。在暂存和生产中,它们应该尽快缓存(因此all.css从单独的 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(being www/all.cssand 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 的工作方式一样多 =)

4

3 回答 3

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

这与您之前的尝试有相同的问题(即您需要 export GIT_WORK_TREE),但它也有一个更微妙的问题。正如我在这篇博文中所描述的,在脚本环境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
于 2011-07-09T18:04:44.267 回答
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

那么你不需要导出。这对我来说很完美。

于 2012-05-08T13:58:49.580 回答
1
GIT_WORK_TREE=....
export GIT_WORK_TREE
git ...
rm $GIT_WORK_TREE/...

应该可以工作并且是最安全的(您并不总是需要导出环境变量,但通常它不会有害:))

于 2011-07-09T13:45:13.383 回答