2016-05-17 137 views
2

下面是我的预提交的git hoook条件始终返回false

#!/bin/bash 

.... 
# if git diff -U0 "$FILE_PATH" | grep -iq 'todo'; # Double quoting $FILE_PATH doesnt' change anything 
if git diff -U0 $FILE_PATH | grep -iq 'todo'; 
then 
    echo $FILE_PATH ' -> Contains TODO' 
    exit 1 

else 
    echo 'nooooooooooooooooooooooooooooooooooo' 
fi 

我总是得到noooooooooooooooooooo消息,但是,下面的命令,直接想我的终端上,效果很好:

git diff -U0 my/file/path.php | grep -iq 'todo' && echo 'true' || echo 'false' 

输出

true 

UPDATE

当运行bash .git/hooks/pre-commit它的作品,很奇怪!

FYI

我不知道这是否是一个重要的信息,但git的/挂钩/预提交的是一个symbolik环节最有可能

+1

双引号'$ FILE_PATH'然后再试一次... – Jahid

+0

@Jahid不会改变结果,我总是在从我的终端尝试时得到'true' – smarber

+0

你是如何运行脚本和谁? 'git diff -U0 $ FILE_PATH | grep -i'todo''在脚本中自行运行时返回?那么'git diff -U0 $ FILE_PATH'呢? – 123

回答

1

,你管不返回状态0。验证这种情况(而不是你写的复合语句的方式),你可以把它改写为

git diff -U0 "$FILE_PATH" | grep -iq 'todo' 
grep_status=$? 
echo grep status is $grep_status 
if ((grep_status == 0)) 
then 
    echo contains todo 
else 
    echo no 
fi 

我还注意到,您的代码包含在if线的不必要的分号。我首先想到这个分号可能会导致奇怪的行为,但至少在我的bash,我试过你的代码,它似乎没有任何伤害。不过,为了安全起见,我会将其删除。

+0

,总是给出'grep status is 1' – smarber

+0

那么,这意味着* todo *这个词在'git diff'的输出中没有找到。如果你认为情况并非如此,那么可以将git输出的副本指向stdout,例如:'git diff -U0“$ FILE_PATH”| tee tmp $$; grep -iq todo tmp $$' – user1934428