2011-12-12 66 views
1

我想写一个简单的预先提交钩子来检查文件是否被修改,如果是这样,压缩它并将其添加到当前索引,像这样git pre-commit hook,将文件添加到索引

#!/bin/sh                                      

# was the file modified? 
mf='git status | grep jquery.detectBrowser.js' 

# is the non-compressed file in the staging area? 
if [ $mf != "" ] 
then 
    # alert the user 
    echo "Javascript file modified, YUI Compressor will begin now." 

    # go to rhino 
    cd $HOME/apps/rhino/yuicompressor-2.4.7/build 

    # compress my file 
    java -jar yuicompressor-2.4.7.jar ~/www/jquery.detectBrowser.js/jquery.detectBrowser.js -o ~/www/jquery.detectBrowser.js/jquery.detectBrowser.min.js 

    # comeback to the initial directory 
    cd - 

    # add the new file into the index 
    git add ~/www/jquery.detectBrowser.js/jquery.detectBrowser.min.js 
fi 

我有2个问题,1我的条件是失败的,每一次,我必须有一个错字或类似的东西,但我不明白它是什么?这是我回来的错误:

[: 23: git: unexpected operator 

我的第二个问题是,即使我删除的条件的文件从来没有真正加入到承诺,它的修改,但没有被加入进来。

感谢, 利奥

+1

'git diff --cached'显示已经在索引中的变化。也许你只需要定期使用'git diff'呢?另外,如果您有任何其他未添加的文件,您的条件将失败。另外,它应该是'=='而不是'='。你可能真的想为你正在寻找的文件“grep”,而不是使用'=='。 – Amber

+0

谢谢琥珀,我已更新帖子以反映您的反馈。 – leopic

+0

@Amber:我认为OP *只会在这个文件发生变化时才会这样做。虽然有点模糊。 – Cascabel

回答

3

你的错误是因为你没有引用$mf。将其更改为"$mf"。虽然也许有更好的方法比输入一个人类可读的命令更好......例如,你可以看看git status --porcelain。甚至git diff --cached <path>,只是检查出代码,例如:

if ! git diff --quiet --cached <path>; then 
    # the file was modified; do stuff 
fi 

我认为琥珀,可能会误导你:应该使用--cached,因为如果所做的更改不会上演,那么只要这个承诺是有关,没有变化,所以我假设你不想做其他事情。

当然,我不知道你的项目,但我不知道你为什么要这样做 - 通常你不想检查机器生成的内容,只是让它容易从检查的内容重建。

至于你最后的问题,文件被修改,但没有添加到提交,我不能用玩具的例子重现它。我做了这是一个pre-commit钩子:

#!/bin/bash 
touch z 
git add z 

,并提出了提交,和z是如预期创建,添加和承诺。

+0

我完全同意不将机器生成的内容添加到存储库,这里的事情是,这是一个jQuery插件,我想提供文件的非压缩版本和压缩版本,无论用户想要去与,这是他们的选择。 – leopic

+1

@LEOPiC:您的*用户是通过克隆回购获得这些东西,但无法运行单个命令来执行此操作?这很不寻常。有两件正常的事情可以处理任何机器生成的内容:使它成为“构建”过程(即克隆源代码,运行一个命令,完成)的一个简单部分,并使用它,使其成为您的分发/部署/打包过程(创建压缩版本并将其扔到tarball中)。 – Cascabel

+0

好吧,并非所有的项目都有一个与它们相关的蚂蚁,我完全了解你们的观点,在我们工作的公司中,我们对每个环境都有单独的构建过程,每个过程由几个蚂蚁任务组成,但这是一次性的由于这个插件更加针对前端用户,我相信可以提供一个可用的缩小版本的案例是有效的。 – leopic