2014-09-02 59 views
0

出于某种原因,我的bash开关总是返回false /或者,我正在寻找一种方法来抑制git的响应,这将对用户/不存在,但不能得到这个工作?GIT的ls-remote测试开关总是返回false

[ git ls-remote https://github.com/ehime/Bash-Tools.git &>- /dev/null ] && { 
    echo Exists 
} || { 
    echo Nope 
} 

我想这和它的工作,但不会剿内容,如我想

[ "$(git ls-remote foo)" ] && { echo Yes; } || { echo No; } 
+1

你是不是在测试你是给测试一系列运行git的字符串(这几乎肯定会导致'['输出错误信息)。 – 2014-09-02 21:42:56

+0

我最初使用'[“$(git ls-remote https://github.com/ehime/Bash-Tools.git&> -/dev/null)”] && {echo Yes; } || {echo No; }' – ehime 2014-09-02 21:43:37

+0

这将正确地运行git命令,但是因为你试图放弃所有不会做你想做的任何输出。 – 2014-09-02 21:44:12

回答

1

你是不是在测试你是给测试一系列字符串运行git(这是几乎肯定会导致[输出错误消息)。

如果您试图运行该命令而忽略所有输出并仅测试要删除包围的返回码[]。它们不是if语法的一部分。 [是一个二进制(与test同义)。

if git ls-remote ...; then将运行git并测试其返回码。

此外,/dev/null有没有为你做任何事情。 $>-已关闭标准输入和标准输出。 /dev/nullgit ls-remote的“ref”参数。

0

我一直在寻找的是

[ "$(git ls-remote $REPOSITORY_URL 2> /dev/null)" ] && { echo Exists; } || { echo Nope; } 

全部的git命令为受限制的git的外壳,如果有人想它

# If no project name is given 
if [ $# -eq 0 ]; then 
    # Display usage and stop 
    echo "Usage: addrepo <project.git>" ; exit 1 
fi 

# Set the project name, adding .git if necessary 
project=$(echo "$*" | sed 's/\.git$\|$/.git/i') 

[ "$(git ls-remote $project 2> /dev/null)" ] && { 
    cd /home/git/repositories/ 
    git clone --mirror "${project}" 
} || { 
    echo "[ERROR] Unable to read from '${project}'"; exit 1 
} 
+0

你可能实际上想要测试返回代码而不是输出。这就是为什么'--exit-code'存在的原因,但是是的,这可以工作,假设'ls-remote'只有在发现一些引用时才输出(假设这是你想要的测试)。 – 2014-09-02 21:55:10

+0

不幸的是,退出代码通常会在回购成功时与其返回bool false,因此也总是会使语句失败。恕我直言,试图镜像一个空的存储库是毫无意义的。 – ehime 2014-09-02 22:07:31

+0

啊,真的,'--exit-code'的文档确实似乎表明返回代码并不像它可能的那样有用。 – 2014-09-02 22:12:12