2012-12-05 96 views
6

我正在编写一个脚本来自动为我设置新项目。从git命令捕获输出?

这包括拉下github存储库。

我想要做的是从我的一些脚本输出,然后调用git clone $repo

我想表明从该命令的输出在运行时,但是当它运行,如果它已成功运行代替它的输出(注意只是git命令的输出,我仍然希望之前的输出在那里)和repository successfully cloned,如果失败,就把输出留在那里,然后打印repository cloning failed

我该怎么做?

下面是我目前(相当简单)的脚本。

#! /bin/bash 

# -p project name 

templateurl="[email protected]:xxx/xxx-site-template.git" 

while getopts ":p:" opt; do #eventually I'll add more options here 

case $opt in 
    p) 
    project=$OPTARG 
    ;; 
    \?) 
    echo "Invalid option: -$OPTARG" >&2 
    exit 1 
    ;; 
    :) 
    echo "Option -$OPTARG requires an argument." >&2 
    exit 1 
    ;; 
esac 
done 

if [ -z "$project" ]; then 
    echo "Project name required" 
    exit 1 
fi 

clear 
echo "|==========================|" 
echo "| New xxx Project Creator |" 
echo "|==========================|" 
echo "Project: $project" 

if [ -d "$project" ]; then 
    echo "Directory $project already exists!" 
    exit 1 
fi 


mkdir $project 
if [ ! -d "$project" ]; then 
    echo "Failed to create project directory!" 
    exit 1 
fi 

echo "Cloning xxx Template repository" 
git clone $templateurl $project 

回答

10

git clone确实提供退出代码,您可以使用$读取?如下所示:

git clone [email protected]:repo 
echo $? 

如果一切正常,它将打印0。例如,如果该文件夹不是一个Git仓库,你会得到退出代码128

您可以检查是否克隆工作如下:

git clone [email protected]:repo localrepo --quiet 
success=$? 
if [[ $success -eq 0 ]]; 
then 
    echo "Repository successfully cloned." 
else 
    echo "Something went wrong!" 
fi 

--quiet将抑制从混帐任何输出,只要没有错误。所以如果你只是删除else分支,你会得到正面的输出或git产生的错误。

+0

我已经将脚本的底部改为'git clone $ templateurl $ project --quiet success = $? if [[success -eq 0]]; 然后 echo“已成功克隆存储库”。 fi' 但是我得到错误'[[:未找到]与if语句行。另外,我认为我的问题稍有误解,我仍然希望在命令运行时显示正常输出,以便用户获得有关正在发生的事情的一些反馈。但是一旦命令完成,我想清除那个输出。 – Hailwood

+0

if语句中有$ missing:'[[$ success ...;'如果你想删除已经打印的输出,你必须处理回车符(\ r),然后覆盖旧的输出。我假设删除已经打印的输出是不可能的。 – sge

+0

另一种可能性是使用ANSI-Escape-Codes http://ascii-table.com/ansi-escape-sequences.php。例如'echo -e“\ 033 [2K”'删除活动行。设置光标位置和删除线条的组合可能会导致成功。 – sge

4
git clone [email protected]:repo localrepo > git.log 2>&1 
if [[ $? eq 0 ]]; 
then 
    echo Repository successfully cloned. 
else 
    cat git.log 
    echo Repository cloning failed. 
fi 

rm git.log 

说明:

git clone [email protected]:repo localrepo > git.log 2>&1 重定向输出和错误流git.log。 > git.log将stdout重定向到git.log 2>&1将stderr重定向到与stdout相同的位置(因此,git.log)。

$? eq 0检查git的retcode,如果克隆成功,它应该是0。

cat git.log输出git.log文件的内容。

+0

'GITOUTPUT = \'git clone user @ server:repo localrepo \'''''''''''''''''''''即使'git clone ...>/dev/null'也不会抑制任何输出。 – sge

+1

然后它必须写入stderr。我会发布一个不同的答案。 – antik

+1

git checkout也去stderr(但git拉到标准输出?)。这救了我! – rob5408