git - 从 Expect 脚本运行 Git 命令失败

标签 git tcl expect

我正在编写一个 Expect 脚本,以便每次在 AWS 上生成新服务器实例时从我们的开发服务器中提取最新代码。这个想法是,当创建新服务器时,脚本会在启动时运行,然后再放置在负载均衡器后面。除非 Git 由于冲突而中止,否则它会完美地工作。这是到目前为止的代码:

#!/usr/bin/expect -f
set timeout 240

spawn /xyz/pullfromdev
expect "*?assphrase*"
send -- "<mypass>\r"

expect {
        "Aborting" {
                set response $expect_out(buffer)
                set format [split $response "\n"]
                cd /var/www/html
                foreach line $format {
                        if { !([string range $line 0 8] == "Identity " || [string range $line 0 8] == "Updating " || [string range $line 0 5] == "error:" || [string range $line 0 6] == "Please," || [string range $line 0 7] == "Aborting" || [string length $line] == 1 ) } {
                                open "| git checkout -- [string trim $line]"
                        }
                }
                spawn /xyz/pullfromdev
                expect "*?assphrase*"
                send -- "<mypass>\r"
        }
}

expect eof

基本上我正在分割输出缓冲区并尝试运行 git checkout -- <filename>对于每个有冲突的文件。然后尝试再次 pull 以希望成功完成。

问题出在以下行:

open "| git checkout -- [string trim $line]"

它显然不执行任何操作,并且我没有收到任何错误。该脚本尝试再次从开发服务器 pull 并中止,因为 git checkout 没有发生并且冲突仍然存在。 TCL 对我来说有点陌生,所以也许是语法问题?我尝试过spawn和exec,但它们似乎也不起作用。冲突仍然存在并且 git 中止。

但是,如果我运行 git checkout -- <filename>通过命令行,那么该特定文件不再冲突(因为 checkout 实际上发生了)。所以问题实际上是让 git checkout 命令从 Expect 脚本运行,而我却未能做到这一点。

有人有什么建议吗?

如果有帮助的话,这是在 CentOS 5 上,代码中引用的“pullfromdev”脚本很简单:

#!/bin/bash
cd /var/www/html
ssh-agent bash -c 'ssh-add /xyz/<identity>; git pull'

最佳答案

打开管道时,除了第一个字符之外的所有内容都是 Tcl 参数列表(第一个 | 很特殊)。这意味着你应该使用这个:

open |[list git checkout -- [string trim $line]]

关于git - 从 Expect 脚本运行 Git 命令失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9504367/

相关文章:

git 每次推送都需要密码

git - 我如何通过 git 命令行工具获取 pull 请求中更改的文件列表?

tcl - 如何在 {expect} 脚本中创建 "loop"语句?

git - 将未提交的更改移动到新分支

git - 项目管理软件,可用选项

c - 在动态库中打包一些OpenGL命令,得到 "wglMakeCurrent failed"

tcl - 类的真实命名空间

tcl - 我们可以在 tcl 脚本中使用任何过滤器吗?

linux - 如何将退出状态从 Expect 传播到其父 Bash 脚本?

windows - 为什么tcl期望意外退出?