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

Rud*_*die 11 git bash git-checkout

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

我的工作流程非常简单:

  1. 在当地发展(D)
  2. 承诺一些事情
  3. 承诺更多的事情
  4. 推送到舞台(和Github)(S)
  5. 在Staging上测试新代码
  6. 推动生产(P)

我的代码包含由我的代码缩小的CSS文件,然后保存到1个文件中:all.css.在本地,我已关闭该选项,因此all.css每次更改CSS时我都不必手动删除.在Staging和Production上,他们应该尽快缓存(因此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
Run Code Online (Sandbox Code Playgroud)

我想重用$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
Run Code Online (Sandbox Code Playgroud)

$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
Run Code Online (Sandbox Code Playgroud)

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

GIT_WORK_TREE=/var/www/www.example.org
git checkout -f
Run Code Online (Sandbox Code Playgroud)

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

GIT_WORK_TREE=/var/www/www.example.org
cd $GIT_WORK_TREE
git checkout -f
Run Code Online (Sandbox Code Playgroud)

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

我想我的问题与Bash如何工作一样多,因为它与GIT如何工作=)

Mar*_*air 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
Run Code Online (Sandbox Code Playgroud)

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

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

$ 
Run Code Online (Sandbox Code Playgroud)

你的下一次尝试是:

GIT_WORK_TREE=/var/www/www.example.org
git checkout -f
Run Code Online (Sandbox Code Playgroud)

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

你的最后一次尝试是:

GIT_WORK_TREE=/var/www/www.example.org
cd $GIT_WORK_TREE
git checkout -f
Run Code Online (Sandbox Code Playgroud)

这与您之前的尝试(即您需要导出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
Run Code Online (Sandbox Code Playgroud)


小智 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
Run Code Online (Sandbox Code Playgroud)

那你就不需要出口了.这对我来说很完美.