如何将失败的git pullpush操作通过expect脚本实现自动重启?

摘要:问题的提出 最近使用 github 上传、下载项目代码时,经常会卡很久,有时候在命令行打了 git push 然后就去上厕所了,结果等我回来的时候,发现 push 早已经失败了,还得重新提交一下。如果有一个工具,可以不停的重启失败的 git
问题的提出 最近使用 github 上传、下载项目代码时,经常会卡很久,有时候在命令行打了 git push 然后就去上厕所了,结果等我回来的时候,发现 push 早已经失败了,还得重新提交一下。如果有一个工具,可以不停的重启失败的 git push 直到它成功才退出,那就好了。 什么是 expect 在介绍使用 expect 重启 git 操作之前,先简单说明一下这个命令。其实它并不是一个新潮的东西,在很早以前就存在了,以至于现在一些系统默认都不带这个命令了,需要自己手工安装下: $ sudo yum install expect $ expect -v expect version 5.44.1.15 简单的说,expect 就是完成一些需要与用户交互的任务,例如 telnet、ftp、ssh 远程登录机器的时候,这些命令会要求用户输入用户名、密码等相关信息,而这些,是无法通过 shell 脚本来完成的。这是因为这些命令是从控制终端而不是标准输入上读取的,所以无法事先将信息重定向到标准输入从而实现自动化运行。而 expect 就是用来解决这类问题的,下面是一个使用 expect 进行 ssh 登录的例子: 1 #!/usr/bin/expect -f 2 set ipaddr "localhost" 3 set passwd "iforgot" 4 5 spawn ssh root@$ipaddr 6 expect { 7 "yes/no" { send "yes\r"; exp_continue} 8 "password:" { send "$passwd\r" } 9 } 10 11 expect "]# " 12 send "touch a.txt\r" 13 send "exit\r" 14 expect eof 15 exit expect 脚本里有这么几个关键动作: spawn :启动需要执行的命令; expect :解析命令输出,并根据下面的匹配语句进入子控制块; send :向命令发送信息,这些信息相当于是命令从控制终端读取的; interact :继续命令与控制终端的交互,此时用户可以正常向命令输入信息(本例未展示)。 …… 好了,熟悉了 expect 的用法后,有人可能有疑问了,这个 git pull/push 操作也不涉及密码,用它做什么呢?这就是因人而异了,有些人是因为密码的关系用它,而我只看中了它的 expect 动作。
阅读全文