gpt4 book ai didi

git - 在接收后 Hook 中重用 GIT_WORK_TREE 来 rm 一些文件

转载 作者:IT王子 更新时间:2023-10-29 00:49:55 27 4
gpt4 key购买 nike

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

我的工作流程非常简单:

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

我的代码包含由我的代码缩小并保存到 1 个文件的 CSS 文件:all.css。在本地,我已关闭该选项,因此我不必每次更改 CSS 时都手动删除 all.css。在 Staging 和 Production 上,它们应该尽快缓存(因此从单独的 CSS 文件创建 all.css)。

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

根据教程,我制作了一个post-receive Hook ,用于将更改 checkout 到特定文件夹(Apache 读取代码的位置)。

我当前的 post-receive Hook :

#!/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: file doesn't exist etc (/www/all.css) ($GIT_WORK_TREE is empty)

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

fatal: this operation must be run in a work tree

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

fatal: Not in a git repository (or any .....)

我想我的问题既与 Bash 的工作方式有关,也与 GIT 的工作方式有关 =)

最佳答案

您目前尝试的有一些问题。也许最好依次解释您尝试过的每个示例的问题所在:

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_DIRpost-receive 脚本环境中设置为 . (即当前目录)。因此,如果您将目录更改为工作树的顶部,GIT_DIR 将指向该目录,而不是 .git 目录!一些好的经验法则是 (a) 您应该只将 GIT_DIRGIT_WORK_TREE 设置在一起,并且 (b) 如果您确实设置了它们,则应该同时设置它们到绝对路径。因此,我认为以下钩子(Hook)适用于您的情况:

#!/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

关于git - 在接收后 Hook 中重用 GIT_WORK_TREE 来 rm 一些文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6635018/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com