2011-12-12 65 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