为 GIT 克隆创建理智

为 GIT 克隆创建理智

我想创建一个 Jenkins 管道,每 5 分钟运行一次 GIT 克隆健全性。如果 GIT 克隆命令不起作用/失败或通过,我如何捕获错误/问题?

答案1

一般的做法是

if command; then
    # Every went OK
else
    # Something failed
fi

它适用于git

if git clone ...; then
    # The repo was cloned correctly
else
    # Something failed
fi

git clone仅当命令以状态 0 退出(表示成功)时,才会采用第一个分支;任何其他退出状态都被视为失败,并导致采用第二个分支。

答案2

对于不存在的文件acat如果git它相当于:

]# e=$(cat a 2>&1 1>/dev/null)
]# echo ret=$? out=\"$e\"
ret=1 out="cat: a: No such file or directory"

现在我有了命令输出,这是 cat 的 stdout 被 stderr 替换,作为“结果”值。返回代码免费提供$?

为了比较成功cat

]# e=$(cat atext 2>&1 1>/dev/null)
]# echo ret=$? out=\"$e\"
ret=0 out=""

-> 成功重定向到 null,空错误消息。

]# e=$(cat atext)
]# echo ret=$? out=\"$e\"
ret=0 out="First line of a"

-> 成功,因此“$e”保存数据。


]# e=$(cat xxx 2>&1 1>/dev/null)
]# echo ret=$? out=\"$e\"
ret=1 out="cat: xxx: Is a directory"

-> 消息很详细,但退出代码保持统一。

是的,我有一个目录xxxgit clone .git xxx当我试图引发特定错误时,它刚刚为我制作了它。

(所以我切换到cat

]# e=$(cat -M 2>&1 1>/dev/null)
]# echo ret=$? out=\"$e\"
ret=1 out="cat: invalid option -- 'M' Try 'cat --help' for more information."
]# 

仍然ret=1。


评论中的链接显示了一些关于失踪的投诉具体的git 的错误代码。我认为这是一个双重误解,因为(瓷器)git 命令是为了交互式使用而设计的,而(bash)shell 有它自己的关于输入和输出的概念。

在我的示例中,我不应该抱怨 cat 的统一错误代码“1”,或者尝试捕获并解析 a 中的消息复杂的脚本(这与简单的程序)。我应该先检查一切是否准备就绪,并在必要时告诉用户(错误或警告)。

我想知道您从 中得到什么样的错误代码git clone。 git 的手册页对返回码非常沉默。就像 vi 的例子一样。mount与“代码可以进行或运算” 非常不同。


给定“不安全”命令,git clone $d我可以将错误代码以及源代码添加到消息中。这是一个交互式单行:

]# d='xxx'; git clone $d || echo "g. cl. failed with $?"
fatal: destination path 'xxx' already exists and is not an empty directory.
g. cl. failed with 128

作为一个脚本,这并不是那么明显;我会这样做:

]# . gc.sh 
fatal: destination path 'xxx' already exists and is not an empty directory.
g. cl. failed with 128

cat gc.sh

d='xxx'
git clone $d; ret=$?  
if (( $ret > 0 )) 
   then echo "g. cl. failed with $ret"
fi

否则$?不够新鲜。对真/假的测试也是明确的。

相关内容