将Git Push保存到输出文件中

4

我是一名Git的新手。

我的问题是,我需要通过一个在Windows上运行的shell脚本来将Git的Push命令保存到输出文件中。

到目前为止,我有类似于以下的东西:

echo -e "\n6) ${GREEN}Starting Push.${NC}"
git push -v >> logs/logPush.log

if grep -q -w -i "Rejected" logs/logPush.log ; 
then 
    echo "${RED}A conflict has been detected. Exiting.${NC}" 
    read
    exit
else
    :
fi

但它总是生成一个空文件。拉取操作运行良好...有人知道如何使输出文件接收终端上出现的所有信息吗?
Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 289 bytes | 0 bytes/s, done.
Total 3 (delta 2), reused 0 (delta 0)
To ssh:repository
   42be914..ead1f82  master -> master
updating local tracking ref 'refs/remotes/origin/master'
3个回答

8

将stderr也重定向到文件中:

git push -v >> logs/logPush.log 2>&1

看起来git push--porcelain选项可以实现这个功能:

--porcelain

生成机器可读的输出。每个引用的输出状态行将以制表符分隔并发送到stdout而不是stderr。 将给出引用的完整符号名称。


6

UNIX shell默认提供两个输出流-- stdout和stderr.

这通常很有用,因为当您将输出重定向到其他地方时,仍希望错误信息显示在屏幕上。

 $ cat nosuchfile | grep something
 cat: nosuchfile: No such file or directory

这就是我想要的。我不想要cat: nosuchfile: No such file or directory被输入到grep中。
正如您所知,您可以使用>|重新定向标准输出。
您可以使用2>重新定向错误输出:
$ cat nosuchfile > outfile 2>errormessage

一个常用的习语是:
$ somecommand > output 2>&1

这里的&1是指stdout使用的文件描述符。因此,你告诉shell将stderr发送到与stdout相同的位置。

您可以使用2>&1将stderr发送到输出文件中。或者您可以利用此处所学的知识来理解有关--porcelain的git文档,或设计其他解决方案,例如在适当的情况下将stderr发送到第二个文件。


非常感谢您提供的完整示例! - Manddy

2

我猜测git push的退出状态将指示它是否成功。您应该使用它而不是解析日志:

if ! git push -v >> logs/logPush.log 2>&1
then 
    echo "${RED}Failed to push. Exiting.${NC}" 
    read
    exit
fi

我已经使用了2>&1将stderr重定向到stdout,这样日志中就包含了两个输出——这是可选的。
如果命令失败,这不一定表示存在冲突,所以我修改了错误消息为更通用的内容。

1
这是正确的做法。你不应该依赖于人类阅读的信息 - 如果git被翻译成另一种语言,它就会出错。 - Thorbjørn Ravn Andersen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接