草庐IT

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

coder 2023-06-25 原文

我已经使用这个“教程”来设置 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/

有关git - 在接收后 Hook 中重用 GIT_WORK_TREE 来 rm 一些文件的更多相关文章

  1. ruby-on-rails - RSpec:避免使用允许接收的任何实例 - 2

    我正在处理旧代码的一部分。beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)endRubocop错误如下:Avoidstubbingusing'allow_any_instance_of'我读到了RuboCop::RSpec:AnyInstance我试着像下面那样改变它。由此beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)end对此:let(:sport_

  2. ruby-on-rails - has_one :through work?如何 - 2

    我有三个模型:classReleaseItem:pack_release_itemsendclassPack:pack_release_itemsendclassPackReleaseItem问题是,在执行期间,如果我将一个包添加到release_item,它并不知道该包是一个包。例如:Loadingdevelopmentenvironment(Rails2.1.0)>>item=ReleaseItem.new(:filename=>'MAESTRO.TXT')=>#>>pack=Pack.new(:filename=>'legion01.zip',:year=>1998)=>#>>i

  3. ruby-on-rails - 如何生成传递一些自定义参数的 `link_to` URL? - 2

    我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些

  4. ruby-on-rails - 如何使用 Rack 接收 JSON 对象 - 2

    我有一个非常简单的RubyRack服务器,例如:app=Proc.newdo|env|req=Rack::Request.new(env).paramspreq.inspect[200,{'Content-Type'=>'text/plain'},['Somebody']]endRack::Handler::Thin.run(app,:Port=>4001,:threaded=>true)每当我使用JSON对象向服务器发送POSTHTTP请求时:{"session":{"accountId":String,"callId":String,"from":Object,"headers":

  5. SPI接收数据异常问题总结 - 2

    SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手

  6. git使用常见问题(提交代码,合并冲突) - 2

    文章目录git常用命令(简介,详细参数往下看)Git提交代码步骤gitpullgitstatusgitaddgitcommitgitpushgit代码冲突合并问题方法一:放弃本地代码方法二:合并代码常用命令以及详细参数gitadd将文件添加到仓库:gitdiff比较文件异同gitlog查看历史记录gitreset代码回滚版本库相关操作远程仓库相关操作分支相关操作创建分支查看分支:gitbranch合并分支:gitmerge删除分支:gitbranch-ddev查看分支合并图:gitlog–graph–pretty=oneline–abbrev-commit撤消某次提交git用户名密码相关配置g

  7. ruby - 找一些句子 - 2

    我想找到在某些文本中找到一些(让它是两个)句子的好方法。什么会更好-使用正则表达式或拆分方法?你的想法?应JeremyStein的要求-有一些例子示例:输入:ThefirstthingtodoistocreatetheCommentmodel.We’llcreatethisinthenormalway,butwithonesmalldifference.IfwewerejustcreatingcommentsforanArticlewe’dhaveanintegerfieldcalledarticle_idinthemodeltostoretheforeignkey,butinthis

  8. ruby-on-rails - 在所有延迟的作业之前 Hook - 2

    是否可以在所有delayed_job任务之前运行一个方法?基本上,我们试图确保每个运行delayed_job的服务器都有我们代码的最新实例,所以我们想运行一个方法来在每个作业运行之前检查它。(我们已经有了“check”方法并在别处使用它。问题只是关于如何从delayed_job中调用它。) 最佳答案 现在有一种官方方法可以通过插件来做到这一点。这篇博文通过示例清楚地描述了如何执行此操作http://www.salsify.com/blog/delayed-jobs-callbacks-and-hooks-in-rails(本文中描述

  9. ruby - Dropbox 类似 git 的服务——没有 rsync 和 inotify - 2

    关于如何使用git设置类似Dropbox的服务,您有什么建议吗?您认为git是解决此问题的合适工具吗?我在考虑使用git+rush解决方案,你觉得怎么样? 最佳答案 检查这个开源项目:https://github.com/hbons/SparkleShare来自项目的自述文件:Howdoesitwork?SparkleSharecreatesaspecialfolderonyourcomputer.Youcanaddremotelyhostedfolders(or"projects")tothisfolder.Theseprojec

  10. ruby - 混帐 & ruby : How can I unset the GIT_DIR variable from inside a ruby script? - 2

    我编写了一个非常简单的“部署”脚本,作为我的裸git存储库中的post-updateHook运行。变量如下livedomain=~/mydomain.comstagingdomain=~/stage.mydomain.comgitrepolocation=~/git.mydomain.com/thisrepo.git(bare)core=~/git.mydomain.com/thisrepo.gitcore==addedremoteintoeachlive&stagegitslive和stage都初始化了gitrepos(非裸),我已经将我的裸仓库作为远程添加到它们中的每一个(名为co

随机推荐